GCP Artifact Registry

Introduction

The GCP Artifact Registry is a hosted docker repository that requires extra configuration for day-to-day use. This configuration is not typical of other repositories, and there are some considerations to account for when using it with Earthly. This guide will walk you through creating an Earthfile, building an image, and pushing it to Artifact Registry.
​Artifact Registry is the successor to the GCP Container Registry (GCR). It can accommodate more than just Docker images, but those are beyond the scope of this guide. Most of what we detail here applies to GCR as well, it will just require some small tweaks.

Create an Earthfile

No special considerations are needed in the Earthfile itself. You can use SAVE IMAGE just like any other repository.
1
FROM alpine:3.13
2
​
3
build:
4
RUN echo "Hello from Earthly!" > motd
5
ENTRYPOINT cat motd
6
SAVE IMAGE --push <region>-docker.pkg.dev/<project>/hello-earthly/hello-earthly:with-love
Copied!

Configure the Artifact Repository Credential Helper

Artifact Repository does not issue permanent credentials. Instead, it relies on your Google credentials to issue Docker credentials. To this end, Google has built-in a credential helper to the gcloud CLI tool. gcloud can update your .docker/config.json on its own by running gcloud auth configure-docker <region>-docker.pkg.dev. Here is a sample entry it might create:
1
{
2
"credHelpers": {
3
"<region>-docker.pkg.dev": "gcloud"
4
}
5
}
Copied!

IAM

Ensure that you have correct permissions to push and pull the images. Please reference the GCP documentation to ensure you have the correct permissions set. You will need to add the Artifact Registry Reader and Artifact Registry Writer roles to complete the tasks in this guide.
If you are using GCR; keep in mind that the needed permissions are based on the GCP storage permissions. We used the Storage Admin permissions to complete the guide with GCR.
Service Accounts also work with Earthly. Rather than gcloud init, simply log in using the Google-provided key like this:
1
RUN gcloud auth activate-service-account --key-file /test/key.json
Copied!

Run the Target

With the helper installed, no special To build and push an image, simply execute the build target. Don't forget the --push flag!
1
❯ earthly --push +build
2
buildkitd | Found buildkit daemon as docker container (earthly-buildkitd)
3
alpine:3.13 | --> Load metadata linux/amd64
4
+base | --> FROM alpine:3.13
5
+base | [β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ] resolve docker.io/library/alpine:[email protected]:0bd0e9e03a022c3b0226667621da84fc9bf562a9056130424b5bfbd8bcb0397f ... 100%
6
+build | --> RUN echo "Hello from Earthly!" > motd
7
output | --> exporting outputs
8
output | [β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ] exporting layers ... 100%
9
output | [β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ] exporting manifest sha256:08f310b4520418a60f7c12b168167ea22b886bc03d43ab87058e959ef5c14cf2 ... 100%
10
output | [β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ] exporting config sha256:8a54361d584a6a51f0136b9ae1526aba8f99cc0a1583954b0f206d3a472eaac9 ... 100%
11
output | [β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ] pushing layers ... 100%
12
output | [β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ] pushing manifest for <region>-docker.pkg.dev/<project>/hello-earthly/hello-earthly:with-love ... 100%
13
output | [β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ] sending tarballs ... 100%
14
2bc1eb057e55: Loading layer [==================================================>] 187B/187B
15
=========================== SUCCESS ===========================
16
Loaded image: <region>-docker.pkg.dev/<project>/hello-earthly/hello-earthly:with-love
17
+build | Image +build as <region>-docker.pkg.dev/<project>/hello-earthly/hello-earthly:with-love (pushed)
Copied!

Pulling Images

Using this credential helper; you can also pull images without any special handling in an Earthfile:
1
FROM earthly/dind:alpine-main
2
​
3
run:
4
WITH DOCKER --pull <region>-docker.pkg.dev/<project>/hello-earthly/hello-earthly:with-love
5
RUN docker run <region>-docker.pkg.dev/<project>/hello-earthly/hello-earthly:with-love
6
END
Copied!
And here is how you would run it:
1
❯ earthly -P +run
2
buildkitd | Found buildkit daemon as docker container (earthly-buildkitd)
3
e/dind:alpine-main | --> Load metadata linux/amd64
4
u/e/h/hello-earthly:with-love | --> Load metadata linux/amd64
5
u/e/h/hello-earthly:with-love | --> DOCKER PULL <region>-docker.pkg.dev/<project>/hello-earthly/hello-earthly:with-love
6
u/e/h/hello-earthly:with-love | [ ] resolve <region>-docker.pkg.dev/<project>/hello-earthly/hello-earthly:[email protected]:08f310b4520418a60f7c12b168167ea22b886bc03d43ab87058e959ef5c14cf2 ... 0% [β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ] resolve <region>-docker.pkg.dev/<project>/hello-earthly/hello-earthly:[email protected]:08f310b4520418a60f7c12b168167ea22b886bc03d43ab87058e959ef5c14cf2 ... 100%
7
+base | --> FROM earthly/dind:alpine-main
8
+base | [β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ] resolve docker.io/earthly/dind:[email protected]:09f497f0114de1f3ac6ce2da05568fcb50b0a4fd8b9025ed7c67dc952d092766 ... 100%
9
+run | *cached* --> WITH DOCKER (install deps)
10
+run | *cached* --> WITH DOCKER RUN docker run <region>-docker.pkg.dev/<project>/hello-earthly/hello-earthly:with-love
11
output | --> exporting outputs
12
output | [β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ] sending tarballs ... 100%
13
=========================== SUCCESS ===========================
Copied!
Last modified 18d ago