我构建了一个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
该作业的状态为“失败”。
出了什么问题?我在本地运行容器,可以启动脚本而不会出现任何错误。
答案 0 :(得分:3)
删除您的ENTRYPOINT
行。但是,请用CMD
代替它,表明容器实际上在做什么。
Docker容器运行的主要命令有两个部分:ENTRYPOINT
和CMD
;当容器启动时,它们是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'
]
}
)