Docker 容器在使用 AWS ECR 的 AWS ECS 中不起作用

Posted

技术标签:

【中文标题】Docker 容器在使用 AWS ECR 的 AWS ECS 中不起作用【英文标题】:Docker Container not working in AWS ECS using AWS ECR 【发布时间】:2020-10-31 07:09:51 【问题描述】:

我有一个 docker 容器,并且必须使用 AWS ECR 和 Elastic Beanstalk 在 AWS 云上进行部署。我正在使用Dockerrun.aws.json 文件来提供有关存储库详细信息的信息。我已将我的图像推送到我的 docker hub 和 Elastic Container Registry。

在 ECS 中使用 DockerHub,它可以从 docker hub 拉取 docker 镜像并启动容器而不会出现任何问题并按预期运行应用程序。另一方面,当从同一应用程序的 AWS ECR 存储库中提取映像时,容器会停止。部署失败的原因:Essential container in task exited

Dockerrun.aws.json


    
    "containerDefinitions": [
        
            "essential": true,
            "image": "01234567891.dkr.ecr.us-east-1.amazonaws.com/app:1",
            "memory": 512,
            "name": "web",
            "portMappings": [
                
                    "containerPort": 5000,
                    "hostPort": 80
                
            ]
        
    ],
    "family": "",
    "volumes": [],
    "AWSEBDockerrunVersion": "2"

我登录到实例并尝试获取容器的日志。 但是,我收到了这个错误standard_init_linux.go:211: exec user process caused "exec format error"

Dockerfile

FROM python:3.4-alpine
ADD . /code
WORKDIR /code
RUN pip install -r requirements.txt
CMD ["python", "app.py"]

【问题讨论】:

你没有详细说明你在做什么,所以几乎不可能给你任何建议。请提供minimal reproducible example 而不仅仅是错误消息。 可能是权限问题,容器永远不会从 ECR 下载?您可以尝试另一个 docker 映像来排除这种情况。 @petern 我尝试过使用不同的图像标签,这些标签从不存在,它显示CannotPullContainerError,但使用现有的图像标签,错误是不同的。 请检查您的 CloudWatch 日志。如果您收到Essential container in task exited,则日志中应该有一些内容描述原因,为什么。对于exec format error,请参阅***.com/questions/36544293/…。好像你的Dockerfile 有错误。 您可能想发布您的Dockerfile 【参考方案1】:

任务定义或 docker-compose 文件中似乎有 depended on docker 容器。

发生此错误,您有容器 BA 上打开,并且 A 对服务是必要的,因此容器 B 将自动退出。

您需要调试为什么A 退出。

任务中的基本容器已退出

如果在任务定义中标记为必需的容器退出或死亡,这可能会导致任务停止。当必要的容器退出是导致任务停止的原因时,Step 6 可以提供有关容器停止原因的更多诊断信息。

stopped-task-errors

【讨论】:

我没有使用docker-compose.yml 文件。这是一个单一的 docker 容器。 如何启动容器? 我使用的是 Elastic Beanstalk,而后者又使用 ECS 进行部署。我正在使用Dockerrun.aws.json 文件。 我明白了,您可以尝试将 essential 设置为 false,以便我们得到准确的错误消息。因为如果您正在运行单个容器,则不需要。 docs.aws.amazon.com/AmazonECS/latest/developerguide/… 我试试【参考方案2】:

问题在于 AWS CodeBuild 项目。我错误地为构建提供了错误的架构。 docker镜像建立在不同的架构上,并尝试在部署状态下运行在不同的架构上。我已更改为用于部署的相同架构。 docker hub 映像和 ECR 映像似乎都可以正常工作。

【讨论】:

我来到这里是因为我在我的 M1 Mac 上构建 Docker 映像并将它们推送到 ECR。糟糕!

以上是关于Docker 容器在使用 AWS ECR 的 AWS ECS 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

将 docker 容器从本地推送到 aws ecr

尽管使用 AWS ubuntu 容器,但我得到 AWS ECR 退出状态 255

带有 Amazon ECR Docker 映像的 AWS Elastic Beanstalk

如何通过 AWS EKS 在 ECR 中使用 Docker 映像

如何在 AWS-ECR 中为 docker 映像使用环境变量?

在 AWS EC2 上从 AWS ECR 中提取图像,而不使用 docker login,但使用 EC2 实例角色和 ECR 存储库权限