首页 > 解决方案 > 如何使用多个并发作业处理 Docker 登录到 Gitlab 容器注册表?

问题描述

我们使用 Gitlab CI/CD,在本地托管的机器上使用运行器构建和部署,并使用 Gitlab 容器注册表来存储我们的 Docker 映像。我们像这样登录到 Gitlab 注册表:

default:
  before_script:
    - "docker login -u \"${CI_REGISTRY_USER}\" -p \"${CI_REGISTRY_PASSWORD}\" \"${CI_REGISTRY}\""

这适用于我们部署环境中的运行器,每个运行器只同时运行一个作业。但是,我们的构建机器应该同时运行多个构建作业。问题是,${CI_REGISTRY_PASSWORD}Gitlab 为每个工作提供的内容是不同的,而且似乎只对那个工作有效。因此,当我们同时运行多个作业时,它们的调用会相互docker login覆盖,导致其他作业因authentication required错误而失败。

目前,我们正在通过docker login在每个之前执行一个新命令来解决这个问题,docker push或者docker pull尽量减少另一个作业在两者之间执行它自己的登录命令的机会,但是必须有更好的方法。

使用并发作业管理 Docker 注册表登录的推荐解决方案是什么?

标签: dockergitlabgitlab-cigitlab-ci-runnerdocker-registry

解决方案


这种事情最好使用部署令牌来处理,这正是它的目的。这允许您设置用户,因此您可以告诉 CI 服务器是推送容器的人,并且出于安全原因还设置过期:

https://docs.gitlab.com/ee/user/project/deploy_tokens/


推荐阅读