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.
build:ARG versionCOPY main.go .RUN go build -o output/example-$version main.go SAVE ARTIFACT output/example-$version AS LOCAL local-output/go-examplewith-copy:COPY (+build/example --version='1.0') .
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.
ARG USERARCHRUN echo $USERARCH
In this case we've declared the ARGUSERARCH which is a builtin that holds the processor architecture the target is being built from.
VERSION 0.7FROM node:13.10.1-alpine3.11WORKDIR /js-exampledeps: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.jsonbuild:FROM +depsCOPY src srcRUN mkdir -p ./dist && cp ./src/index.html ./dist/RUN npx webpack SAVE ARTIFACT dist /dist AS LOCAL distdocker:FROM +depsARG tag='latest'COPY +build/dist ./distEXPOSE 8080ENTRYPOINT ["/js-example/node_modules/http-server/bin/http-server", "./dist"] SAVE IMAGE js-example:$tag