ARGs in Earthly work similar to ARGs in Dockerfiles, however there are a few differences when it comes to scope. Also, Earthly has a number of built in ARGs that are available to use.
Let's say we wanted to have the option to pass in a tag for our Docker image when we run earthly +docker.
docker:ARG tag='latest'COPY +build/example .ENTRYPOINT ["/go-workdir/example"] SAVE IMAGE go-example:$tag
In our +docker target we can create an ARG called tag. In this case, we give it a default value of latest. If we do not provide a default value the default will be an empty string.
Then, down in our SAVE IMAGE command, we are able to reference the ARG with $ followed by the ARG name.
Now we can take advantage of this when we run Earthly.
earthly+docker--tag='my-new-image-tag'
In this case my-new-image-tag will override the default value and become the new tag for our docker image. If we hadn't passed in a value for tag, then the default latest would have been used.
earthly+docker# tag for image will be 'latest'
Passing ARGs in FROM, BUILD, and COPY
We can also pass ARGs when referencing a target inside an Earthfile. Using the FROM and BUILD commands, this looks pretty similar to what we did above on the command line.
We can also pass ARGs when using the COPY command, though the syntax is a little different.
Builtin ARGs
There are a number of builtin ARGs that Earthly offers. You can read about a complete list of them, but for now, let's take a look at how they work.
In order to use Earthly builtin ARGs they need to be pre-declared. Once you do that, you can use them just like any other ARG.
In this case we've declared the ARGUSERARCH which is a builtin that holds the processor architecture the target is being built from.
docker:
ARG tag='latest'
COPY +build/example .
ENTRYPOINT ["/go-workdir/example"]
SAVE IMAGE go-example:$tag
with-build:
BUILD +docker --tag='my-new-image-tag'
with-from:
FROM +docker --tag='my-new-image-tag'
build:
ARG version
COPY main.go .
RUN go build -o output/example-$version main.go
SAVE ARTIFACT output/example-$version AS LOCAL local-output/go-example
with-copy:
COPY (+build/example --version='1.0') .
VERSION 0.7
FROM node:13.10.1-alpine3.11
WORKDIR /js-example
deps:
COPY package.json ./
COPY package-lock.json ./
RUN npm install
# Output these back in case npm install changes them.
SAVE ARTIFACT package.json AS LOCAL ./package.json
SAVE ARTIFACT package-lock.json AS LOCAL ./package-lock.json
build:
FROM +deps
COPY src src
RUN mkdir -p ./dist && cp ./src/index.html ./dist/
RUN npx webpack
SAVE ARTIFACT dist /dist AS LOCAL dist
docker:
FROM +deps
ARG tag='latest'
COPY +build/dist ./dist
EXPOSE 8080
ENTRYPOINT ["/js-example/node_modules/http-server/bin/http-server", "./dist"]
SAVE IMAGE js-example:$tag
VERSION 0.7
FROM openjdk:8-jdk-alpine
RUN apk add --update --no-cache gradle
WORKDIR /java-example
deps:
COPY build.gradle ./
RUN gradle build
build:
FROM +deps
COPY src src
RUN gradle build
RUN gradle install
SAVE ARTIFACT build/install/java-example/bin AS LOCAL build/bin
SAVE ARTIFACT build/install/java-example/lib AS LOCAL build/lib
docker:
COPY +build/bin bin
COPY +build/lib lib
ARG tag='latest'
ENTRYPOINT ["/java-example/bin/java-example"]
SAVE IMAGE java-example:$tag