如何从 gitlab-ci 将 docker 图像发布到 docker hub

How to publish docker images to docker hub from gitlab-ci

Gitlab 提供了一个 .gitlab-ci.yml 模板,用于构建和发布图像到它自己的注册中心(在您的一个项目中单击 "new file",select .gitlab-ci.ymldocker).该文件看起来像这样,开箱即用:)

# 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

但默认情况下,这将发布到 gitlab 的注册表。我们如何才能改为发布到 docker hub

根本不需要更改 .gitlab-ci.yml,我们只需要 add/replace 项目管道设置中的环境变量。

1。找到所需的注册表 url

使用 hub.docker.com 无效,您将收到以下错误:

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

默认 docker 集线器注册表 url 可以这样找到:

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

index.docker.io 正是我要找的。

2。在gitlab settings

中设置环境变量

我想发布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设置很重要
默认为 registry.gitlab.com/<username>/<project>
注册表 url 需要更新,因此请使用 index.docker.io/<username>/<project>

由于 docker hub 是使用 docker 时的默认注册表,您也可以改用 <username>/<project>。我个人更喜欢冗长的内容,所以我保留了完整的注册表 url.

这个答案应该也涵盖其他注册表,只需相应地更新环境变量即可。

为了扩展 GabLeRoux 的回答,

我在 GitLab 的推送阶段遇到了问题 CI build:

denied: requested access to the resource is denied

通过将我的 CI_REGISTRY 更改为 docker.io(删除 index.),我能够成功推送。