Build and Push Your Docker Images to Gitlab Container Registry
When building your application inside Docker you want a private location to store your Docker images. Gitlab has a Docker container registry included in their services. Integrating Gitlab container registry is really simple if you are aleady using Gitlab to host your code. This guide explains how you can integrate Gitlab container registry into your project.
- Gitlab project
- Knowledge of Docker
Build File Config
To build Docker images we use the latest docker image
image: docker:latest . One additional setting needed in the build file is the
docker:dindservice. This service activates docker-in-docker service, which makes Docker able to run within a Docker environment.
image: docker:latest services: - docker:dind
If you have to write the same string more than once it is a good idea to extract it as a variable. We make a local variable called
REPOSITORY. `$CI_REGISTRY` is a built in variable in Gitlab, which points to the registry url. In our case this will be
registry.gitlab.com. The variable stored will have the value
variables: REPOSITORY: $CI_REGISTRY/devugides/docker
Before we can push our docker images to the registry we have to login. This is done by using the
docker login command. Gitlab also have a built in user you can use to authenticate with. The user is available by using the built in variable
CI_REGISTRY_USER. The user gets a one time password which is stored in the variable
CI_REGISTRY_PASSWORD. For the complete login command we then get the following:
before_script: - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
You can read more about Gitlab registry authentication methods in the documentation.
Build Docker Image
In this part of the file we define the Docker image build and push. First we build the Docker image
docker build -f Dockerfile -t $REPOSITORY:latest .. Notice that the variable
$REPOSITORY is the variable we created earlier. The build command assumes that you have a
Dockerfile placed in your root folder of your project. The command also adds the tag
latest to the Docker image. If you want, you can add more tags for instance, you can add build number. After building the image, the image is pushed to the docker registry using the
docker push command.
Lastly, we only want to build the Docker image when code is pushed to the
master branch, and it is achieved by adding the
master branch under the
only section. The complete build step looks like this:
build: stage: build script: - docker build -f Dockerfile -t $REPOSITORY:latest . - docker push $REPOSITORY:latest only: - master
Final Build File
The final Gitlab build file can be found below:
image: docker:latest services: - docker:dind stages: - build variables: REPOSITORY: $CI_REGISTRY/devugides/docker before_script: - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY build: stage: build script: - docker build -f Dockerfile -t $REPOSITORY:latest . - docker push $REPOSITORY:latest only: - master
If you want to see a complete example of a project with a Dockerfile and the Gitlab build file you can have a look at this Gitlab repository.
If you want to support this blog you can do so by signing up to DigitalOcean using this referral link.