Challenge, Medium,  on  Containers Submissions: 26/103

In this ultimate image-copying challenge, your task is to copy not just one, but all the tags of the ghcr.io/iximiuz/labs/nginx image. In other words, you must make a full copy of the public GHCR repository to the playground's private repository at registry.iximiuz.com/third-party/nginx.

Note that some tags may point to multi-platform builds, so ensure you copy all image variants in those cases.

For simplicity, registry.iximiuz.com is accessible without authentication.

Good luck!

Hint 1 💡

It's a good idea to start by listing the tags in the source repository so you know exactly what you need to copy.

Unfortunately, docker doesn't have a command to list tags in a remote repository. The closest alternative is using docker pull --all-tags, but pulling the images to your local machine just to view their tags is a bit excessive.

Can you think of a better way?

Hint 2 💡

Most modern container registries implement the OCI Distribution API, and it's a surprisingly simple API! For instance, to list all the tags of a repository, you just need to send a request like this:

https://<server-address>/v2/<repository>/tags/list.

Here’s what the actual script will look like for GHCR:

REPO=ghcr.io/iximiuz/labs/nginx
TOKEN=$(curl -s https://ghcr.io/token?scope=repository:$REPO:pull | jq -r .token)

curl -s -H "Authorization: Bearer $TOKEN" \
  https://ghcr.io/v2/$REPO/tags/list
Hint 3 💡

Does the curl command from the previous hint seem like too much hassle for a seemingly simple task? Here are some easier alternatives (though you may need to install some of these tools first):

crane ls $REPO
regctl tag ls $REPO
skopeo list-tags docker://$REPO
Hint 4 💡

Once you know the exact list of tags you need to copy, finishing the challenge is simply a matter of applying the solution from the previous challenge in a loop.

Hint 5 💡

Alright, there might be an easier way to copy all tags from one repository to another. Remember crane, regctl, and skopeo? Some of these tools may have a single copy command that loops over all tags and copies them in one go. Can you find it?

Level up your Server Side game — Join 8,400 engineers who receive insightful learning materials straight to their inbox