55

Gitlab provides a .gitlab-ci.yml template for building and publishing images to its own registry (click "new file" in one of your project, select .gitlab-ci.yml and docker). The file looks like this and it works out of the box :)

# This file is a template, and might need editing before it works on your project.
# Official docker image.
image: docker:latest

services:
  - docker:dind

before_script:
  - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY

build-master:
  stage: build
  script:
    - docker build --pull -t "$CI_REGISTRY_IMAGE" .
    - docker push "$CI_REGISTRY_IMAGE"
  only:
    - master

build:
  stage: build
  script:
    - docker build --pull -t "$CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG" .
    - docker push "$CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG"
  except:
    - master

But by default, this will publish to gitlab's registry. How can we publish to docker hub instead?

GabLeRoux
  • 16,715
  • 16
  • 63
  • 81

2 Answers2

82

No need to change that .gitlab-ci.yml at all, we only need to add/replace the environment variables in project's pipeline settings.

1. Find the desired registry url

Using hub.docker.com won't work, you'll get the following error:

Error response from daemon: login attempt to https://hub.docker.com/v2/ failed with status: 404 Not Found

Default docker hub registry url can be found like this:

docker info | grep Registry
Registry: https://index.docker.io/v1/

index.docker.io is what I was looking for.

2. Set the environment variables in gitlab settings

I wanted to publish gableroux/unity3d images using gitlab-ci, here's what I used in Gitlab's project > Settings > CI/CD > Variables

CI_REGISTRY_USER=gableroux
CI_REGISTRY_PASSWORD=********
CI_REGISTRY=docker.io
CI_REGISTRY_IMAGE=index.docker.io/gableroux/unity3d

CI_REGISTRY_IMAGE is important to set.
It defaults to registry.gitlab.com/<username>/<project>
regsitry url needs to be updated so use index.docker.io/<username>/<project>

Since docker hub is the default registry when using docker, you can also use <username>/<project> instead. I personally prefer when it's verbose so I kept the full registry url.

This answer should also cover other registries, just update environment variables accordingly.

GabLeRoux
  • 16,715
  • 16
  • 63
  • 81
  • Could be great to explain where we can do these action more precisely than just " add/replace the environment variables in project's pipeline settings." – Arnaud F. Mar 16 '21 at 17:20
  • 1
    @ArnaudF. I just updated the answer with your suggestion. There are many ways to set the environment variables in a gitlab-ci pipeline. You can do it in the project's CI/CD settings page, but it can also be done using the `variables` key in your `.gitlab-ci.yml`. It is preferable to keep secrets in the settings to prevent to keep them hidden. – GabLeRoux Mar 16 '21 at 18:21
  • I am getting "The push refers to repository [docker.io/user/repo]" still by changing index in registry image – Danwand N S Feb 06 '23 at 15:36
17

To expand on the GabLeRoux's answer,

I had issues on the pushing stage of the GitLab CI build:

denied: requested access to the resource is denied

By changing my CI_REGISTRY to docker.io (remove the index.) I was able to successfully push.

GabLeRoux
  • 16,715
  • 16
  • 63
  • 81
murtis
  • 191
  • 1
  • 3
  • 1
    To state what should be obvious (eventually); the original answer by GabLeRoux has been updated and now "index." prefixes the value in CI_REGISTRY_IMAGE so that it follows the pattern: `index.docker.io//` – rainabba May 28 '20 at 14:20