使用Gitlab注册表中的私有Docker映像作为CI的基础映像

使用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注册表中的映像作为另一个CI构建的基础映像,我应该如何进行身份验证

据我所知,我首先必须手动登录到runner机器上。使用现有的Gitlab用户登录感觉有些奇怪

有没有办法使用CI变量“CI_BUILD_TOKEN”(描述为“用于使用GitLab容器注册表进行身份验证的令牌”)进行身份验证,以从GitLab注册表中提取基本映像

编辑:我发现我可以使用公共项目中的图像。但我真的不想公开我的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:dind
    服务,该服务允许您在docker容器内运行
    docker
    命令
  • 这将要求您使用有效的
    docker登录名
    ,您可以使用GitLab的内置变量(
    GitLab ci-token
    $ci-JOB-token
  • 然后,您应该能够对repo的注册表进行身份验证(例如
    $registry
    value:
    registry.gitlab.com/$USER/$repo:$TAG
    ),这将允许您从CI/CD上下文内部以及任何经过身份验证的docker服务器推送或拉取docker容器
实施: 在顶层创建此块,以确保它在以下作业之前运行:

在脚本之前:
-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命令,以便使用
登录
构建
推送
来工作。只要先登录
,这一切都能正常工作。我将此策略用于多个生产应用程序;如果你有特殊问题,我可以帮你解决。