Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Labelling images in docker

Tags:

docker

I've got a jenkins server monitoring a git repo and building a docker image on code change. The .git directory is ignored as part of the build, but I want to associate the git commit hash with the image so that I know exactly what version of the code was used to make it and check whether the image is up to date.

The obvious solution is to tag the image with something like "application-name-branch-name:commit-hash", but for many develop branches I only want to keep the last good build, and adding more tags will make cleaning up old builds harder (rather than using the jenkins build number as the image is built, then retagging to :latest and untagging the build number)

The other possibility is labels, but while this looked promising initially, they proved more complicated in practice..

The only way I can see to apply a label directly to an image is in the Dockerfile, which cannot use the build environment variables, so I'd need to use some kind of templating to produce a custom Dockerfile.

The other way to apply a label is to start up a container from the image with some simple command (e.g. bash) and passing in the labels as docker run arguments. The container can then be committed as the new image. This has the unfortunate side effect of making the image's default command whatever was used with the labelling container (so bash in this case) rather than whatever was in the original Dockerfile. For my application I cannot use the actual command, as it will start changing the application state.

None of these seem particularly ideal - has anyone else found a better way of doing this?

like image 420
user1130072 Avatar asked Jul 27 '15 08:07

user1130072


People also ask

What is label in Docker image?

Labels are used in Dockerfile to help organize your Docker Images. Labels are key-value pairs and simply adds custom metadata to your Docker Images. Some key points associated with the LABEL instructions are as follows: To include spaces inside a label, you can use quotes.

Why do we label Docker images?

You can use labels to organize your images, record licensing information, annotate relationships between containers, volumes, and networks, or in any way that makes sense for your business or application.

How do I name a Docker image?

You can rename your docker image by docker tag command. Use the below given command to do that. To rename docker container, use the rename sub-command as shown, in the following example, we renaming the container discourse_app to a new name disc_app.


2 Answers

Support for this was added in docker v1.9.0, so updating your docker installation to that version would fix your problem if that is OK with you.

Usage is described in the pull-request below:

https://github.com/docker/docker/pull/15182


As an example, take the following Dockerfile file:

FROM busybox
ARG GIT_COMMIT=unknown
LABEL git-commit=$GIT_COMMIT    

and build it into an image named test as anyone would do naïvely:

docker build -t test .

Then inspect the test image to check what value ended up for the git-commit label:

docker inspect -f '{{index .ContainerConfig.Labels "git-commit"}}' test

unkown

Now, build the image again, but this time using the --build-arg option:

docker build -t test --build-arg GIT_COMMIT=0123456789abcdef .

Then inspect the test image to check what value ended up for the git-commit label:

docker inspect -f '{{index .ContainerConfig.Labels "git-commit"}}' test

0123456789abcdef


References:

  • Docker build command documentation for the --build-arg option
  • Dockerfile reference for the ARG directive
  • Dockerfile reference for the LABEL directive
like image 59
user1803291 Avatar answered Sep 19 '22 15:09

user1803291


You can specify a label on the command line when creating your image. So you would write something like

docker build -t myproject --label "myproject.version=githash" .

instead of hard-coding the version you can also get it directly from git:

docker build -t myproject --label "myproject.version=`git describe`" .

To read out the label from your images you can use docker inspect with a format string:

docker inspect -f '{{index .Config.Labels "myproject.version"}}' myproject
like image 35
user228505 Avatar answered Sep 21 '22 15:09

user228505