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

时间:2020-01-02 10:49:40

标签: python amazon-web-services docker aws-batch

我构建了一个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

该作业的状态为“失败”。

出了什么问题?我在本地运行容器,可以启动脚本而不会出现任何错误。

2 个答案:

答案 0 :(得分:3)

删除您的ENTRYPOINT行。但是,请用CMD代替它,表明容器实际上在做什么。

Docker容器运行的主要命令有两个部分:ENTRYPOINTCMD;当容器启动时,它们是combined together into one command。您的容器正在运行的命令可能类似于

/bin/bash python /runscript.py

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

您严格不需要ENTRYPOINT,这会造成麻烦。相反,通常您只希望容器执行一件事,因此您只需在Dockerfile中指定它即可。

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

答案 1 :(得分:2)

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

Docker File

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'
                ]
            }
        )