如何在构建Docker映像之前向GitLab的容器注册表进行身份验证?

时间:2020-04-16 13:35:08

标签: docker gitlab-ci

我有一个私人的GitLab项目,其中包含用于构建和推送Docker映像的管道。因此,我必须首先向GitLab的Docker注册表进行身份验证。

研究

我读了Authenticating to the Container Registry with GitLab CI/CD

通过GitLab CI / CD向容器注册表进行身份验证的方式有三种,具体取决于项目的可见性。

可用于所有项目,但更适合公共项目:

  • 使用特殊的CI_REGISTRY_USER变量:为您创建了此变量指定的用户,以便推送到与您的项目连接的注册表。它的密码是使用CI_REGISTRY_PASSWORD变量自动设置的。这使您可以自动构建和部署Docker映像,并具有对注册表的读/写访问权限。这是临时性的,因此仅适用于一项工作。您可以按原样使用以下示例:

    docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
    

对于私人和内部项目:

  • 使用个人访问令牌:如果您的项目是私有的,则可以创建和使用个人访问令牌:

    • 对于读取(拉动)访问,作用域应为read_registry
    • 要进行读/写(拉/推)访问,请使用api

    在以下示例中替换<username><access_token>

       docker login -u <username> -p <access_token> $CI_REGISTRY
    
  • 使用GitLab部署令牌:您可以在私有项目中创建并使用特殊的部署令牌。它提供对注册表的只读(拉)访问。创建后,您可以使用特殊的环境变量,GitLab CI / CD将为您填充它们。您可以按原样使用以下示例:

       docker login -u $CI_DEPLOY_USER -p $CI_DEPLOY_PASSWORD $CI_REGISTRY
    

Container Registry

借助更新权限模型,我们还扩展了对访问私有项目的容器注册表的支持。

版本历史记录

您的作业可以访问您通常有权访问的所有容器图像。唯一的含义是,您可以将其推送到为其触发作业的项目的Container Registry。

这是示例用法的样子:

test:
  script:
    - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY
    - docker pull $CI_REGISTRY/group/other-project:latest
    - docker run $CI_REGISTRY/group/other-project:latest

我尝试了第一种和第四种方法,因此可以进行身份​​验证。

问题

优缺点是什么?我猜第三种方法仅用于部署,而不用于构建和推送。第二种可能也是如此。是吗?

为什么其他文档中未列出第四种方式?这样不赞成吗?

2 个答案:

答案 0 :(得分:0)

我相信差异仅在于用户的技能和权限。

任何人都可以做的第一种方法,因为变量会自动显示在正在运行的作业中。

第二,具有任何权限的任何人都可以创建一个个人访问令牌(但是与1相比,它有一个额外的步骤来创建访问令牌)。

第三,具有正确权限的人可以创建部署密钥。部署密钥不会像个人访问令牌那样授予对API的访问权限,并且仅具有拉/读存储库中数据的权限,而不能写入/推送。

第四选项,它允许您从注册表中读取/拉出容器映像,但也可以将其推送到注册表中。如果您有一个CI步骤可以在映像中构建应用程序,或者正在生成容器映像并将其推送到注册表中的任何其他操作(因此,管道中的另一步可以将其下拉并使用它),这将很有帮助。 )。我的猜测是此选项未与其他选项一起列出,因为它是用于构建容器映像的。不过,您可能可以像其他任何人一样使用它。

答案 1 :(得分:0)

我更喜欢第四个选项。注释:“如果用户创建了一个名为 gitlab-deploy-token 的用户名和部署令牌的令牌,则部署令牌的用户名和令牌将作为 CI/CD 变量自动公开给 CI/CD 作业:CI_DEPLOY_USERCI_DEPLOY_PASSWORD分别。

创建部署令牌时,您可以授予对注册表/包注册表的读/写权限。

CI_REGISTRY_PASSWORD 是短暂的,因此如果您有多个部署作业(需要拉取私有映像)并行运行,请避免使用它。