I know that this can be done with dockerhub
. I want to know if there is something similar available for gitlab registry.
The use case is that, I have written a fabric script to revert a deployment to a particular tag provided by the user. Before actually pulling in the images, I want to know whether an image with the specified tag exists in the registry and warn the user accordingly.
I've searched in their documentation, but couldn't find anything.
Note: User here is the person who is deploying the code.
There's a way to check all version tags on Docker Hub (for example), against the local docker image's “Image ID”. You can get every tag from a Docker Registry (like Docker Hub), then use every tag you found, to get the image ID information from the manifest of every image.
The easiest way to list Docker images is to use the “docker images” with no arguments. When using this command, you will be presented with the complete list of Docker images on your system. Alternatively, you can use the “docker image” command with the “ls” argument.
A registry is a storage and content delivery system, holding named Docker images, available in different tagged versions. Example: the image distribution/registry , with tags 2.0 and 2.1 . Users interact with a registry by using docker push and pull commands.
This is stored within /var/lib/docker on the docker host, probably under a container or overlay sub directory, and then under a unique directory name per container.
Gitlab API can be used.
tag=tag_name
image=image_name
private_token=gitlab_private_token
project=project_number
repo_id=$(curl --header "PRIVATE-TOKEN: $private_token" "https://gitlab.com/api/v4/projects/$project/registry/repositories" | jq -c --arg regex ".*\\$image$" '.[] | select(.path | test($regex))'.id)
if [ $( curl --header "PRIVATE-TOKEN: $private_token" "https://gitlab.com/api/v4/projects/$project/registry/repositories/$repo_id/tags/$tag" | jq -r '.name' ) == "$tag" ] ; then
echo "$tag exists"
else
echo "$tag does not exist"
fi
Update: I added a solution that works without access to the docker server (non-privileged mode) below.
Ok, here is a solution I came up with using the docker:stable image by enabling the experimental client features.
mkdir -p ~/.docker
"echo '{\"experimental\": \"enabled\"}' > ~/.docker/config.json"
docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY
docker manifest inspect $IMGNAME:$IMGTAG > /dev/null && exit || true
The exit
terminates the build script in case that tag already exists. Also you should be aware that ~/.docker/config.json
is overwritten. That is also why the login must happen afterwards.
Update: Instead of writing to the config one can also set the DOCKER_CLI_EXPERIMENTAL
environment variable to enabled
. Thus the first two lines can be replaced with export DOCKER_CLI_EXPERIMENTAL=enabled
Update: If you don't have privileged mode turned on and thus no access to the docker-daemon, you can use the registry-api scripts provided by harbor ( Note that they are python2.). This comes handy if you are building a docker image using kaniko, where no access to the docker-daemon is needed.
Unless the GitLab Container Registry supports the kind of curl dockerhub does (with v1/repositories/$1/tags/$2
), I doubt it offers that feature.
For instance, issue 26866 "GitLab Registry available images list/search" is still open after 10 months.
Update for GitLab 12.2 (April 2019, 18 months later)
After working through the implementation, it made sense to create two endpoints:
GET /groups/:id/registry/repositories
- Returns a list of all Docker container repositories for all projects within the group, similar toGET /projects/:id/registry/repositories
and
GET /groups/:id/registry/repositories/tags
- Returns a list of all Docker container repositories for all projects within the group including all tags for each container repository. The response will look something like this:
So that could help checking if an image:tag
exists.
Update GitLab 13.0 (May 2020)
Use search to quickly find and discover images hosted in the GitLab Container Registry
When you or someone on your team publishes an image to the GitLab Container Registry, you need a way to quickly find it and ensure the image was built properly.
If you’re using GitLab CI/CD to publish images with each build, it’s been very difficult to find an image efficiently within the current user interface. Instead, you’ve relied on the command line or the API.We are excited to announce that in 13.0, we’ve added search functionality to the GitLab Container Registry.
Simply navigate to your project or group’s registry and enter an image name to see a list of all your images.
See documentation and issue.
See also GitLab 14.7 (January 2022)
Sort Docker tags in the Container Registry browser
You can now sort the list of tags in the Container Registry tag details page by name.
Previously, there was no sort functionality. This sometimes required you to scroll through many pages to find a specific tag.
By default, the tags list is now sorted by name in ascending order. You may also change the sort order to descending.
See this issue to track any further work on tag sorting.See Documentation and Issue.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With