如何通过单个docker-compose文件在自定义流水线任务中连接两个ACR
方案可行性说明
单docker-compose文件拉取多个ACR镜像的思路本身完全可行,不需要拆分多份compose文件。Docker原生支持同一份配置里引用不同镜像仓库的镜像,只要本地Docker客户端对所有用到的 registry 都完成登录认证即可。
报错根因
你当前遇到的认证报错和多ACR逻辑本身无关,是DockerComposeConnection的调用方式存在问题:
- 该类的
open方法本质是执行对应ACR的docker login操作,你并行调用两次open的逻辑会导致上下文冲突,第二次调用会覆盖第一次的登录状态;如果第二个ACR的订阅、地址参数传错,会直接触发登录失败,不管后续是否用到该ACR的镜像都会报错。 - 你创建第二个ACR的
ACRAuthenticationTokenProvider实例时,可能没有将传入的azureSubscriptionEndpoint、azureContainerRegistry参数替换为第二个ACR对应的值,导致生成的令牌本身无效,调用open时直接报错。
正确实现步骤
- 先在流水线任务参数中新增第二个ACR对应的服务连接、仓库地址输入项
- 顺序完成两个ACR的登录认证,不要并行调用:
// 第一个ACR认证登录 const acr1Token = new ACRAuthenticationTokenProvider( tl.getInput("azureSubscriptionEndpoint1"), tl.getInput("azureContainerRegistry1") ).getAuthenticationToken(); const composeConnection = new DockerComposeConnection(); composeConnection.open("", acr1Token); // 第二个ACR认证登录,复用现有连接实例即可 const acr2Token = new ACRAuthenticationTokenProvider( tl.getInput("azureSubscriptionEndpoint2"), tl.getInput("azureContainerRegistry2") ).getAuthenticationToken(); composeConnection.open("", acr2Token);
- 确认两个ACR都给流水线服务主体配置了
AcrPull权限,流水线服务连接对两个ACR都有访问权限 - 两次登录完成后执行原有
docker-compose up逻辑即可
内容的提问来源于stack exchange,提问作者CodeMonkey
相关产品推荐
相关产品推荐

