从Windows(本地)或Linux (AWS EC2)构建容器具有不同的效果



我一直在玩AWS批处理,当我从本地windows机器构建docker映像并将其推送到ECR时,我很难理解为什么一切都工作,而当我从ubuntu EC2实例这样做时,它不工作。我下面展示的内容改编自本教程。

docker文件非常简单:

FROM python:3.6.10-alpine
RUN apk add --no-cache --upgrade bash
COPY ./ /usr/local/aws_batch_tutorial
RUN pip3 install -r /usr/local/aws_batch_tutorial/requirements.txt
WORKDIR /usr/local/aws_batch_tutorial

本地文件夹中包含以下bash脚本(run_job.sh):

#!/bin/bash
error_exit () {
echo "${BASENAME} - ${1}" >&2
exit 1
}
################################################################################
###### Convert envinronment variables to command line arguments ########
pat="--([^ ]+).+"
arg_list=""
while IFS= read -r line; do
# Check if line contains a command line argument
if [[ $line =~ $pat ]]; then
E=${BASH_REMATCH[1]}
# Check that a matching environmental variable is declared
if [[ ! ${!E} == "" ]]; then
# Make sure argument isn't already include in argument list
if [[ ! ${arg_list} =~ "--${E}=" ]]; then
# Add to argument list
arg_list="${arg_list} --${E}=${!E}"
fi
fi
fi
done < <(python3 script.py --help)
################################################################################
python3 -u script.py ${arg_list} | tee "${save_name}.txt"
aws s3 cp "./${save_name}.p" "s3://bucket/${save_name}.p" || error_exit "Failed to upload results to s3 bucket."
aws s3 cp "./${save_name}.txt" "s3://bucket/logs/${save_name}.txt" || error_exit "Failed to upload logs to s3 bucket."

还包含一个requirement.txt文件,其中包含三个包(awscli,boto3,botocore),和一个虚拟的python脚本(script.py),它只是列出s3桶中的文件,并将列表保存在一个文件中,然后上传到s3。

在我的本地windows环境和EC2实例中,我都用aws configure设置了我的AWS凭据,在这两种情况下,我都可以成功地构建映像,标记它并将其推送到ECR。当我在AWS Batch上提交作业时,问题出现了,它应该使用命令["./run_job.sh"]:

运行ECR容器。
  • 如果AWS Batch使用从windows推送的ECR映像,则一切正常
  • 如果它使用从ec2 linux推送的映像,则作业失败,我能得到的唯一信息是:

状态原因:Task failed to start

我想知道是否有人知道可能导致错误的原因。

我想我解决了这个问题。docker镜像中的run_job.sh脚本必须具有由AWS Batch运行的执行权限(但我认为这在一般情况下是正确的)。由于某些原因,当从Windows构建映像时,脚本具有此权限,但从linux (aws ec2 - ubuntu实例)构建映像时则没有此权限。我通过在Dockerfile中添加以下行来解决这个问题:

RUN chmod u+x run_job.sh

最新更新