我有一个私人的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。
这是示例用法的样子:
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
我尝试了第一种和第四种方法,因此可以进行身份验证。
问题
优缺点是什么?我猜第三种方法仅用于部署,而不用于构建和推送。第二种可能也是如此。是吗?
为什么其他文档中未列出第四种方式?这样不赞成吗?
答案 0 :(得分:0)
我相信差异仅在于用户的技能和权限。
任何人都可以做的第一种方法,因为变量会自动显示在正在运行的作业中。
第二,具有任何权限的任何人都可以创建一个个人访问令牌(但是与1相比,它有一个额外的步骤来创建访问令牌)。
第三,具有正确权限的人可以创建部署密钥。部署密钥不会像个人访问令牌那样授予对API的访问权限,并且仅具有拉/读存储库中数据的权限,而不能写入/推送。
第四选项,它允许您从注册表中读取/拉出容器映像,但也可以将其推送到注册表中。如果您有一个CI步骤可以在映像中构建应用程序,或者正在生成容器映像并将其推送到注册表中的任何其他操作(因此,管道中的另一步可以将其下拉并使用它),这将很有帮助。 )。我的猜测是此选项未与其他选项一起列出,因为它是用于构建容器映像的。不过,您可能可以像其他任何人一样使用它。
答案 1 :(得分:0)
我更喜欢第四个选项。注释:“如果用户创建了一个名为 gitlab-deploy-token
的用户名和部署令牌的令牌,则部署令牌的用户名和令牌将作为 CI/CD 变量自动公开给 CI/CD 作业:CI_DEPLOY_USER
和 CI_DEPLOY_PASSWORD
分别。
创建部署令牌时,您可以授予对注册表/包注册表的读/写权限。
CI_REGISTRY_PASSWORD
是短暂的,因此如果您有多个部署作业(需要拉取私有映像)并行运行,请避免使用它。