使用来自Gitlab Registry的私有Docker Image作为CI的基本映像

时间:2016-07-08 14:55:02

标签: gitlab gitlab-ci gitlab-ci-runner

如果我想将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

4 个答案:

答案 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

希望这会有所帮助。祝你好运!