使用来自 Gitlab Registry 的私有 Docker 图像作为 CI 的基础图像

Using a private Docker Image from Gitlab Registry as the base image for CI

如果我想使用 Gitlab Registry 中的图像作为另一个 CI 构建的基础图像,我应该如何进行身份验证?

根据https://gitlab.com/gitlab-org/gitlab-ci-multi-runner/blob/master/docs/configuration/advanced-configuration.md#using-a-private-docker-registry,我首先必须手动登录跑步者机器。不知何故,用现有的 Gitlab 用户登录感觉很奇怪。

有没有办法使用CI变量"CI_BUILD_TOKEN"(描述为"Token used for authenticating with the GitLab Container Registry")进行身份验证,从Gitlab Registry中拉取基础镜像?

编辑:我发现我可以使用来自 public 项目的图像。但我真的不想让我的 docker 项目 public.

更新:从 Gitlab 8.14 开始,您可以只使用 docker 注册表中构建的 docker 图像。参见 https://gitlab.com/gitlab-org/gitlab-ci-multi-runner/blob/master/docs/configuration/advanced-configuration.md#support-for-gitlab-integrated-registry

不,目前无法以任何优雅的方式做到这一点。 GitLab 应该为基础图像实现显式凭证,这将是最直接和正确的解决方案。

您需要 docker login 在 GitLab Runner 机器上。你不能使用 gitlab-ci-token 因为它们会过期并且依赖于项目,所以你实际上不能为每个项目使用一个令牌。使用您自己的登录几乎是目前唯一可用的解决方案(很高兴在这个问题上得到纠正)。

现在有可能了,他们几个月前就包含了这个选项。

使用gitlab-ci-token作为用户,变量$CI_BUILD_TOKEN作为密码。

此示例适用于 GitLab 8.13.6。如果需要,它会构建测试图像,并在下一阶段使用它来执行语法检查:

build_test:
  stage: build_test_image
  script:
    - docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN $CI_REGISTRY
    - docker build -t $CI_REGISTRY_IMAGE:test -f dockerfiles/test/Dockerfile .
    - docker push $CI_REGISTRY_IMAGE:test
  tags:
    - docker_build
  environment: test

test_syntax:
  image: $CI_REGISTRY_IMAGE:test
  stage: test
  script:
    - flake8 --ignore=E501,E265,E402 .

更新:重新阅读问题,接受的答案是正确的。在我的示例中,作业 test_syntax 将无法通过注册表的身份验证,除非用户从运行器机器手动登录。虽然,如果 2 个运行器在同一台主机上,它可以工作,但这不是最好的解决方案。

gitlab-ci-multi-runner 1.8 there's an option to add the Registry credentials as a variable, so you only need to login once to get the encoded credentials. See documentation.

您可能首先必须登录到您要使用的图像的 gitlab 容器注册表,请参阅下面的示例。注意 before_script: 这基本上是在使用图像之前对您进行授权。

image: docker:latest
services:
  - docker:dind

stages:
  - build

variables:
  CONTAINER_RELEASE_IMAGE: registry.gitlab.com/obonyojimmy/node-mono-clr:latest

before_script:
  - docker login -u $CI_REGISTRY_USER -p $CI_BUILD_TOKEN registry.gitlab.com

build-app:
  stage: build
  image: $CONTAINER_RELEASE_IMAGE
  script:
    - npm run build

从 2018 年 9 月开始,这绝对有可能。我将 post 在这里实现我的天真。

上下文:

  • 您需要利用 docker:dind 服务,它可以让您 运行 在 docker 容器内执行 docker 命令。
  • 这将要求您使用有效的 docker login,您可以使用 GitLab 的内置变量(gitlab-ci-token$CI-JOB-TOKEN)。
  • 然后您应该能够对您的存储库注册表进行身份验证(示例 $REGISTRY 值:registry.gitlab.com/$USER/$REPO:$TAG),这将允许您从 docker 内部推送或拉取容器=47=] 上下文,以及来自任何经过身份验证的 docker 服务器。

实施:

在顶层创建此块以确保它在以下作业之前 运行s:

before_script: 
        - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $REGISTRY

构建映像并将其保存到注册表的作业:

build_container:
    image: docker:latest
    stage: build
    services:
        - docker:dind
    script:
        - docker build -t $REGISTRY .
        - docker push $REGISTRY

使用自定义图像的作业:

build_app:
    image: $REGISTRY
    stage: deploy
    script:
        - npm run build

关于交叉回购作业:

我通过创建一个 "bot" GitLab 用户并酌情为他们分配对 repos/groups 的访问权限来完成此操作。然后只需用适当的环境变量替换 gitlab-ci-token$CI_JOB_TOKEN 即可。仅当基础图像是私有的时才需要这样做。

以上所有答案,包括已接受的答案均已弃用,这在 2021 年是可能的:

https://docs.gitlab.com/ee/ci/docker/using_docker_images.html#access-an-image-from-a-private-container-registry


TL;DR

使用以下格式的适当身份验证信息设置 CI/CD 变量 DOCKER_AUTH_CONFIG 值:

第 1 步:

# The use of "-n" - prevents encoding a newline in the password.
echo -n "my_username:my_password" | base64

# Example output to copy
bXlfdXNlcm5hbWU6bXlfcGFzc3dvcmQ=

第2步(这个JSON是要为DOCKER_AUTH_CONFIG变量设置的值):

{
    "auths": {
        "registry.example.com:5000": {
            "auth": "(Base64 content from above)"
        }
    }
}