我正在尝试将 Amazon 的新 Elastic Container Registry (ECR) 与我的 Jenkins 构建服务集成。我正在使用 Cloudbees Docker Build & Publish 插件来构建容器映像并将它们发布到注册表。
为了使用 ECR 而不是我的私有注册表,我运行了 AWS CLI 命令aws --region us-east-1 ecr get-login
,该命令会发出一个docker login
要运行的命令 - 但我只是复制了密码并从该密码创建了一个类型为“带密码的用户名”的 Jenkins 凭证(用户名是总是“AWS”)。
这很好用!问题是 AWS CLI 生成的 ECR 密码仅在 12 小时内有效。所以现在,我必须每天两次手动重新生成密码并手动更新 Jenkins 凭据屏幕,否则我的构建开始失败。
有没有办法生成永久 ECR 登录令牌,或者以某种方式自动生成令牌?
现在可以使用amazon-ecr-credential-helper,如https://aws.amazon.com/blogs/compute/authenticating-amazon-ecr-repositories-for-docker-cli-with-credential-helper/中所述。
它的短处是:
{"credsStore": "ecr-login"}
正如@Connor McCarthy 所说,在等待亚马逊为更多永久密钥提供更好的解决方案的同时,我们需要以某种方式自己在 Jenkins 服务器上生成密钥。
我的解决方案是定期使用 Groovy API 每 12 小时自动更新 ECR 的 Jenkins 凭据。这是基于这个非常详细的答案,尽管我做了一些不同的事情,我不得不修改脚本。
脚步:
ecr:GetAuthorizationToken
到服务器角色即可。[更新]要成功完成任何推送,您还需要授予以下权限:ecr:InitiateLayerUpload, ecr:UploadLayerPart, ecr:CompleteLayerUpload, ecr:BatchCheckLayerAvailability, ecr:PutImage
. Amazon 有一个提供这些功能的内置策略,称为AmazonEC2ContainerRegistryPowerUser
.dpkg -l python-pip >/dev/null 2>&1 || sudo apt-get install python-pip -y; pip list 2>/dev/null | grep -q awscli || pip install awscli
请注意:
"AWS"
作为 ECR 凭证的用户名 - 这就是 ECR 的工作方式,但如果您有多个用户名为“AWS”的凭证,那么您需要更新脚本以根据描述字段什么的。null
ID 的值(如我之前链接的答案),则会创建一个新 ID,并且 docker build 步骤中的凭据设置将丢失。就是这样 - 脚本应该能够每 12 小时运行一次并刷新 ECR 凭据,我们可以继续使用 Docker 插件。
我也在研究这个完全相同的问题。我没有想出我们两个人都在寻找的答案,但我能够使用 shell 脚本创建一个解决方法。在 AWS 推出更好的 ECR 凭证解决方案之前,我计划按照这些方式做一些事情。
我将 Jenkins 作业的 Docker Build and Publish 步骤替换为 Execute Shell 步骤。我使用以下脚本(可能写得更好)来构建我的容器并将其发布到 ECR。根据需要替换 < > 括号中的变量:
将https://wiki.jenkins-ci.org/display/JENKINS/Amazon+ECR与 Docker Build and Publish 插件一起使用就可以了。