我有一个AWS批处理作业,当它试图在ECR中运行Docker镜像时返回以下错误:
exec /usr/local/bin/python3: exec format error
字符串
我在macOS上使用M1芯片构建了镜像。因此,我使用以下命令使用--platform linux/amd64
参数构建了镜像。我还尝试了--platform linux/x86_64
:
docker buildx build --no-cache --platform linux/amd64 -t repository-name:latest .
型
然后我运行docker inspect --format='{{.Architecture}}' repository-name:latest
,它返回arm64
。容器的CPU架构是X86_64。这是我的问题所在吗?如果是,我的构建步骤有什么不正确?
这是我的Docker文件:
FROM python:3.9
WORKDIR /usr/src/app/
COPY . /usr/src/app/
RUN pip install --no-cache-dir -r requirements.txt
EXPOSE 80
ENV NAME World
CMD ["python3", "/usr/src/app/hello_world.py"]
型
这是我的hello_world.py脚本:
import pandas as pd
print('hello world!')
型
其他故障排除:
1.运行docker run -it <image> bash
以验证/usr/src/app
路径是否正确。
1.已验证Docker中Python 3二进制文件的路径,which python3
。
1.运行图像python3 /usr/src/app/hello_world.py
,输出正确。
1.重新编译和重新创建作业、作业定义和存储库。
我希望这些细节足以帮助我解决问题。
谢谢你的阅读。
2条答案
按热度按时间wi3ka0sx1#
执行格式错误
这个错误是典型的不匹配的CPU架构,所以是的,你的假设是正确的。
您为Intel/AMD 64位构建容器映像的命令是正确的。我怀疑您在尝试将容器部署到AWS Batch服务时使用了不匹配的容器映像标记。请确保在运行
inspect
命令时引用的标记与build
命令相同,而不是每次都使用latest
标记。这可能就是为什么你会看到不一致的结果。zbdgwd5y2#
我找到了一个解决方案。尽管在build命令中使用了
--no-cache
,但本地层显然被缓存了,在我运行docker system prune -a
后,再次构建并检查了构建,它处于正确的架构amd64中。我推到存储库,它正确运行。缓存统治着我周围的一切。