如果我想将Gitlab注册表中的图像用作另一个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”(被描述为“用于通过GitLab容器注册表进行身份验证的令牌”)进行身份验证以从Gitlab Registry中提取基本映像?
编辑:我发现我可以使用公共项目中的图像。但我真的不想公开我的码头工程。更新:从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
答案 0 :(得分:5)
现在有可能,几个月前他们已经包含了这个选项。
使用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中,可以选择将注册表凭据添加为变量,因此您只需登录一次即可获取编码凭据。请参阅documentation。
答案 1 :(得分:4)
不,目前无法以任何优雅的方式实现。 GitLab应该为基本图像实现显式凭证,这将是最直接和正确的解决方案。
您需要在GitLab Runner计算机上docker login
。您不能使用gitlab-ci-token
,因为它们已过期且与项目有关,因此您无法为每个项目实际使用一个令牌。使用您自己的登录信息几乎是目前唯一可用的解决方案(很高兴能够对此进行更正)。
答案 2 :(得分:1)
您可能首先必须登录要使用的图像的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 gitlab-ci-token -p $CI_BUILD_TOKEN registry.gitlab.com
build-app:
stage: build
image: CONTAINER_RELEASE_IMAGE
script:
- npm run build
答案 3 :(得分:1)
从2018年9月开始,这是绝对可能的。我将在此处发布我的幼稚实现。
在顶层创建此块,以确保它在每个作业之前运行:
before_script:
- docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $REGISTRY
用于构建图像并将图像保存到GitLab注册表(示例$REGISTRY
值:registry.gitlab.com/$USER/$REPO:$TAG
):
build_container:
image: docker:latest
stage: build
services:
- docker:dind
script:
- docker build -t $REGISTRY .
- docker push $REGISTRY
这将允许您从Dockerfile内部使用自定义映像,只要Docker用户可以访问该映像的注册表即可。
将自定义图像用作构建步骤之一:
build_app:
image: $REGISTRY
stage: deploy
script:
- npm run build
希望这会有所帮助。祝你好运!