从 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 文件,其中包含三个包 (awscliboto3botocore), 和一个虚拟 python 脚本 (script.py),它仅列出 s3 存储桶中的文件并将列表保存在文件中,然后上传到 s3。

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

运行 ECR 容器

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