从 Windows(本地)或 Linux(AWS EC2)构建容器有不同的效果
Building container from Windows (local) or Linux (AWS EC2) has different effects
我一直在玩 AWS Batch,当我从本地 windows 机器构建 docker 图像并将其推送到 ECR 时,我无法理解为什么一切正常,而当我从 ubuntu EC2 实例执行此操作时,它不起作用。
我在下面展示的内容改编自 this tutorial.
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} - " >&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 推送的图像,作业失败,我唯一能得到的信息是:
Status reason: Task failed to start
我想知道是否有人知道可能导致错误的原因。
我想我解决了这个问题。
docker 图像中的 run_job.sh
脚本必须具有 AWS Batch 的 运行 执行权限(但我认为这通常是正确的)。
出于某种原因,当图像是从 Windows 构建时,脚本具有此权限,但当图像是从 linux (aws ec2 - ubuntu 实例)构建时则没有。
我通过在 Dockerfile 中添加以下行解决了这个问题:
RUN chmod u+x run_job.sh
我一直在玩 AWS Batch,当我从本地 windows 机器构建 docker 图像并将其推送到 ECR 时,我无法理解为什么一切正常,而当我从 ubuntu EC2 实例执行此操作时,它不起作用。 我在下面展示的内容改编自 this tutorial.
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} - " >&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"]
:
- 如果 AWS Batch 使用从 windows 推送的 ECR 图像,一切正常
- 如果它使用从 ec2 linux 推送的图像,作业失败,我唯一能得到的信息是:
Status reason: Task failed to start
我想知道是否有人知道可能导致错误的原因。
我想我解决了这个问题。
docker 图像中的 run_job.sh
脚本必须具有 AWS Batch 的 运行 执行权限(但我认为这通常是正确的)。
出于某种原因,当图像是从 Windows 构建时,脚本具有此权限,但当图像是从 linux (aws ec2 - ubuntu 实例)构建时则没有。
我通过在 Dockerfile 中添加以下行解决了这个问题:
RUN chmod u+x run_job.sh