AWS Batch:/usr/local/bin/python:无法执行二进制文件

AWS Batch:/usr/local/bin/python: cannot execute binary file

我构建了一个 AWS Batch 计算环境。我想在作业中 运行 一个 python 脚本。 这是我正在使用的 docker 文件:

FROM python:slim
RUN apt-get update
RUN pip install boto3 matplotlib awscli
COPY runscript.py /
ENTRYPOINT ["/bin/bash"]

我的任务定义中的命令是:

python /runscript.py

当我在 AWS 控制台中提交作业时,我在 CloudWatch 中收到此错误:

/usr/local/bin/python: /usr/local/bin/python: cannot execute binary file

作业的状态为 FAILED。

出了什么问题?我在本地 运行 容器,我可以在没有任何错误的情况下启动脚本。

删除你的 ENTRYPOINT 行。但是用 CMD 替换它,说明容器实际在做什么。

主要命令有两个部分,即 Docker 容器 运行、ENTRYPOINTCMD;当容器启动时,这些是 combined together into one command。您的容器是 运行ning 的命令可能类似于

/bin/bash python /runscript.py

因此 bash 在其 $PATH 中找到一个 python(成功),并尝试将其 运行 作为 shell 脚本(导致错误)。

严格来说,您不需要 ENTRYPOINT,这会造成麻烦。相反,您通常希望容器做一件事,因此您应该在 Docker 文件中指定它。

# No ENTRYPOINT
CMD ["python", "/runscript.py"]

您可以尝试使用以下 docker 文件和任务定义。

Docker 文件

FROM python:slim
RUN apt-get update
RUN pip install boto3 matplotlib awscli
COPY runscript.py /
CMD ["/bin/python"]

任务定义

['/runscript.py']

通过在任务定义中传递脚本名称,您可以在提交作业时灵活地 运行 使用任何脚本。请参考以下示例提交作业并覆盖任务定义。


import boto3
session = boto3.Session()
batch_client = session.client('batch')

response = batch_client.submit_job(
            jobName=job_name,
            jobQueue=AWS_BATCH_JOB_QUEUE,
            jobDefinition=AWS_BATCH_JOB_DEFINITION,
            containerOverrides={
                'command': [
                    '/main.py'
                ]
            }
        )