使用来自 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 年是可能的:
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)"
}
}
}
如果我想使用 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 年是可能的:
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)"
}
}
}