docker - 如何使用多个并发作业处理 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 注册表登录的推荐解决方案是什么?
解决方案
这种事情最好使用部署令牌来处理,这正是它的目的。这允许您设置用户,因此您可以告诉 CI 服务器是推送容器的人,并且出于安全原因还设置过期:
推荐阅读
- javascript - 如何在 DataTable 的单个单元格中创建多个超链接
- vue.js - 在 Vue 中是否可以使用自定义指令或渲染函数以编程方式使用转换包装元素或组件?
- java - Jboss EAP 7 部署失败 - "{\"WFLYCTL0080: 失败的服务\" => {\"jboss.deployment.unit.\\\"OptionsManagementREST.war\\\"
- javascript - Webpack Encore 未在基本模板中加载 JavaScript
- html - 试图找出带有背景图像和部分块的布局
- node.js - 如何使用node.js将对API调用的JSON响应的值存储在与(未知)对象数量一样多的变量中
- ruby - Ruby 多个代码块如何协同工作/链接时如何工作?
- c++ - 从 ROOT 更改目录 (C++)
- javascript - 如何通过网站在 IOS 设备上录制音频
- pyspark - 如何使用 Pyspark/SQL/DataFrames SPARK RDD 更新/删除 DB2 源表数据?