使用Gitlab注册表中的私有Docker映像作为CI的基础映像
如果我想使用Gitlab注册表中的映像作为另一个CI构建的基础映像,我应该如何进行身份验证 据我所知,我首先必须手动登录到runner机器上。使用现有的Gitlab用户登录感觉有些奇怪 有没有办法使用CI变量“CI_BUILD_TOKEN”(描述为“用于使用GitLab容器注册表进行身份验证的令牌”)进行身份验证,以从GitLab注册表中提取基本映像 编辑:我发现我可以使用公共项目中的图像。但我真的不想公开我的docker项目使用Gitlab注册表中的私有Docker映像作为CI的基础映像,gitlab,gitlab-ci,gitlab-ci-runner,Gitlab,Gitlab Ci,Gitlab Ci Runner,如果我想使用Gitlab注册表中的映像作为另一个CI构建的基础映像,我应该如何进行身份验证 据我所知,我首先必须手动登录到runner机器上。使用现有的Gitlab用户登录感觉有些奇怪 有没有办法使用CI变量“CI_BUILD_TOKEN”(描述为“用于使用GitLab容器注册表进行身份验证的令牌”)进行身份验证,以从GitLab注册表中提取基本映像 编辑:我发现我可以使用公共项目中的图像。但我真的不想公开我的docker项目 更新:从Gitlab 8.14开始,您可以只使用内置docker注册
更新:从Gitlab 8.14开始,您可以只使用内置docker注册表中的docker映像。请参见否,目前以任何优雅的方式都不可能做到这一点。GitLab应该为基本映像实现显式凭据,这将是最直接、最正确的解决方案
您需要在GitLab Runner机器上登录docker。您不能使用
gitlab ci令牌
,因为它们过期了,而且还依赖于项目,所以您实际上不能为每个项目使用一个令牌。使用您自己的登录几乎是目前唯一可用的解决方案(很高兴在这个问题上得到纠正)。现在有可能了,他们几个月前就已经包括了这个选项
使用gitlab ci-token
作为用户,变量$ci\u BUILD\u-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\u语法
将无法对注册表进行身份验证,除非用户从runner计算机手动登录。虽然,如果两个跑步者在同一台主机上,它可以工作,但无论如何,这不是最好的解决方案
在中,有一个选项可以将注册表凭据添加为变量,因此您只需登录一次即可获得编码的凭据。请参阅。您可能首先必须登录到要使用的映像的gitlab容器注册表,请参见下面的示例。注意
before\u脚本:
它基本上在使用图像之前对您进行身份验证
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月起,这是完全可能的。我将在这里发布我的天真实现 背景:
- 您需要利用
服务,该服务允许您在docker容器内运行docker:dind
命令docker
- 这将要求您使用有效的
,您可以使用GitLab的内置变量(docker登录名
,GitLab ci-token
)$ci-JOB-token
- 然后,您应该能够对repo的注册表进行身份验证(例如
value:$registry
),这将允许您从CI/CD上下文内部以及任何经过身份验证的docker服务器推送或拉取docker容器registry.gitlab.com/$USER/$repo:$TAG
在脚本之前:
-docker登录-u gitlab ci令牌-p$ci\u作业\u令牌$REGISTRY
生成图像并将其保存到注册表的作业:
build\u容器:
图片:docker:最新
阶段:建造
服务:
-码头工人:丁
脚本:
-docker构建-t$注册表。
-docker push$注册表
使用自定义映像的作业:
build\u应用程序:
图像:$REGISTRY
阶段:部署
脚本:
-npm运行构建
关于交叉回购工作:
我通过创建一个“bot”GitLab用户并根据需要为他们分配对repo/组的访问权限来实现这一点。然后,只需使用适当的环境变量替换
gitlab ci-token
和$ci\u-JOB\u-token
。仅当基本映像为私有映像时才需要此选项。谢谢。你说得对。现在不可能。我发现了一些提示:接下来,有几个gitlab问题与以更优雅的方式公开此功能有关()。然而,这似乎是目前积压的工作。希望有了更多的支持,该功能将成为团队认为与用户社区一样重要的功能。您使用什么类型的跑步者来实现这一点?如果您使用的是shell运行程序,那么GitLab CI不会从注册表中提取映像,而是使用您在上一阶段刚刚在主机上构建的映像。一个是shell executor,另一个是docker executor。shell executor的预期用途只是构建Docker映像,这就是为什么我使用标签Docker\u build
。还要注意作业test\u语法中的image
指令,以及build\u test
中缺少该指令。docker将抛出一个错误,除非您添加“$”:$CONTAINER\u RELEASE\u IMAGEbefore\u脚本未在作业“之前”运行。它只是与script元素连接在一起,并在作业中指定的映像的上下文中运行。考虑到这一点,这看起来不可行?我通常在扩展作业中使用before\u脚本
,这样它就可以与多个其他docker作业共享(一个用于推送到gitlab/dockerhub/等,具体取决于标记/分支)。它打算在映像的上下文中运行,并利用dind
服务,因为映像需要访问docker命令,以便使用登录
,构建
,推送
来工作。只要先登录,
,这一切都能正常工作。我将此策略用于多个生产应用程序;如果你有特殊问题,我可以帮你解决。