如何在 Jenkins ECS 插件中使用 ECR Image

Posted

技术标签:

【中文标题】如何在 Jenkins ECS 插件中使用 ECR Image【英文标题】:How to use ECR Image in Jenkins ECS plugin 【发布时间】:2020-03-29 07:20:09 【问题描述】:

我有一个安装了 Amazon EC2 容器服务插件 的 Jenkins 服务器。我可以使用 jenkins/jnlp-slave 等示例图像在 ECS 中运行从属设备,但我想使用 AWS ECR 存储库中存在的我自己的自定义图像作为从属设备。

我在配置系统部分的 ECS 模板中将映像名称指定为 ID.dkr.ecr.us-east-1.amazonaws.com/python-slave:latest,

但它无法调出从机。我去ECS集群查看错误原因,我可以在任务详细信息中看到对于ECR图像它正在尝试使用以下命令来调出容器,

-url http://xyz:8084/ b0a06a93aa32251b22ae3a1a198e2d8a2057f2808b7947ed612b9e1eebb109c5 'ecs java slave-4b15n' 

失败,错误为,

Status reason   CannotStartContainerError: Error response from daemon: OCI runtime create failed: container_linux.go:348: starting container process caused "exec: \"-url\": executable file not found in $PATH": unknown
Command ["-url","http://xyz:8084/","b0a06a93aa32251b22ae3a1a198e2d8a2057f2808b7947ed612b9e1eebb109c5","ecs java slave-4b15n"]
Privileged  false

但是如果我使用像 jenkins/jnlp-slave 这样的示例图像,它使用以下命令并且运行良好

jenkins-agent -url http://xyz:8084/ bf8b42ab34d2691732026d8f454027c46d4ddaf9e9a7abc5af9c1ce417facf7a 'ecs java slave-x6p3z'

我试图找出这种行为的确切原因,但没有运气。无论如何我们可以使用ECS插件将ECR图像用作jenkins Slave。

【问题讨论】:

【参考方案1】:

我也遇到了这个问题。您必须使用 jnlp-slave 映像,或带有构建工具的扩展映像或 cloudbees 从属映像(如果您使用的是 cloudbees)。

然后,您可以通过添加所需的库来扩展 docker 映像。您可以使用 'apt-get' 向其中添加图像

一个用python扩展从属图像的例子

FROM jenkins/jnlp-slave:latest
RUN apt-get install -y -f python3 python3-pip

将其视为通用 debian 映像。你可以安装任何你需要的东西。

【讨论】:

【参考方案2】:

为了拉取 ECR 镜像,我们应该通过注册中心对 docker 客户端进行身份验证,那么只有你应该能够拉取镜像

例如。 $(aws ecr get-login --no-include-email --region us-east-1)

【讨论】:

ECS 实例能够拉取镜像,但由于命令从 -url 而不是问题描述的 jenkins-agent 开始,因此无法将其作为容器运行【参考方案3】:

我遇到了同样的问题。我将自定义映像推送到 docker hub,并在 ECS 容器服务插件中将其路径指定为“用户名/存储库”。请记住,会有一个带有“最新”标签的图像版本。我仍在研究如何对 ECR 上的自定义图像做同样的事情。解决后我会在这里更新。

【讨论】:

以上是关于如何在 Jenkins ECS 插件中使用 ECR Image的主要内容,如果未能解决你的问题,请参考以下文章

从jenkins docker ecs容器中访问ecr图像

“最新”标签在 ECS 任务定义和从 ECR 中提取的容器实例中如何工作?

Jenkins Amazon ECR 插件登录问题“授权令牌已过期”

将新映像推送到 ECR 存储库时如何自动部署到 ECS Fargate

Docker 推送到 AWS ECR 问题

新 ECS 任务定义的 CI/CD