首页 > 解决方案 > 如何在构建 Docker 映像之前对 GitLab 的容器注册表进行身份验证?

问题描述

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

研究

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

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

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

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

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

对于私人和内部项目:

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

    • 对于读取(拉取)访问,范围应该是read_registry.
    • 对于读/写(拉/推)访问,使用api.

    替换以下示例中的<username>and :<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
    

容器注册表

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

版本历史

您的作业可以访问您通常可以访问的所有容器映像。唯一的含义是您可以推送到触发作业的项目的容器注册表。

示例用法如下所示:

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

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

问题

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

为什么其他文档中没有列出第四种方式?这种方式被弃用了吗?

标签: dockergitlab-ci

解决方案


我相信差异只是关于用户技能和权限。

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

其次,具有任何权限的任何人都可以创建个人访问令牌(但与创建访问令牌相比,有一个额外的步骤)。

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

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


推荐阅读