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

3

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

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


你的 Python 文件有 shebang 吗? - samthegolden
不是!这是强制性的吗?$ - Souad
不过,如果“PATH”没有正确设置,那么您可以插入一个shebang来告知解释器在哪里找到二进制文件。您本地的Python可能与容器内部的位置不同。 - samthegolden
@samthegolden 这里不需要shebang行。实际上,由于OP明确调用了python二进制文件,因此shebang行会被忽略。 - Konrad Rudolph
2个回答

7

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

Docker容器运行的主要命令分为两部分:ENTRYPOINTCMD; 当容器启动时,它们会被组合成一个命令。你的容器运行的命令可能像这样:

/bin/bash python /runscript.py

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

你不一定需要ENTRYPOINT,这会导致问题。相反,通常只有一件事情是你希望容器执行的,所以你应该在Dockerfile中指定它。

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

我尝试了您提供的解决方案,但是出现了以下错误:standard_init_linux.go:190: exec user process caused "exec format error" - Souad
只是一个问题,如果我通过CMD在dockerfile中调用脚本,那么在作业定义的命令中应该调用什么? - Souad
不需要使用“command”命令(https://docs.aws.amazon.com/batch/latest/userguide/job_definition_parameters.html#containerProperties),您可以将其省略。 - David Maze

3
你可以尝试使用以下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'
                ]
            }
        )


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接