如何使用AWS Batch将EFS装载到Docker容器卷?

gk7wooem  于 2023-08-03  发布在  Docker
关注(0)|答案(1)|浏览(156)

我一辈子都想不通。
我能找到的文档并没有描述如何做到这一点( Jmeter 板上有很多“Hello World”)。我正在通过命令行界面运行它。
我想知道如何使用AWS Batch来处理一些数据。为了做到这一点,我将我的工作流程容器化,并将Docker容器推到DockerHub。由于Docker容器只能看到容器内的文件,因此我在Docker容器中设置了目录来挂载卷。每个Docker容器都有以下目录:/volumes/input//volumes/output//volumes/database/。我从S3复制必要的文件到EFS,但我有麻烦让所有的部分一起工作。

特别是,我需要帮助创建一个作业定义,该定义执行以下操作:1)从DockerHub中拉取我的Docker容器; 2)将EFS文件系统挂载到容器; 3)指定EFS中要Map到容器中卷的本地路径。

以下是我在运行Docker的本地机器上的典型工作流程:

# Directories
LOCAL_WORKING_DIRECTORY=$(pwd)
LOCAL_WORKING_DIRECTORY=$(realpath -m ${LOCAL_WORKING_DIRECTORY})
LOCAL_OUTPUT_PARENT_DIRECTORY=../
LOCAL_OUTPUT_PARENT_DIRECTORY=$(realpath -m ${LOCAL_OUTPUT_PARENT_DIRECTORY})
LOCAL_DATABASE_DIRECTORY=${VEBA_DATABASE}
LOCAL_DATABASE_DIRECTORY=$(realpath -m ${LOCAL_DATABASE_DIRECTORY})

CONTAINER_INPUT_DIRECTORY=/volumes/input/
CONTAINER_OUTPUT_DIRECTORY=/volumes/output/
CONTAINER_DATABASE_DIRECTORY=/volumes/database/

# Parameters
ID=S1
R1=Fastq/${ID}_1.fastq.gz
R2=Fastq/${ID}_2.fastq.gz
NAME=VEBA-preprocess__${ID}
RELATIVE_OUTPUT_DIRECTORY=veba_output/preprocess/

# Command
CMD="preprocess.py -1 ${CONTAINER_INPUT_DIRECTORY}/${R1} -2 ${CONTAINER_INPUT_DIRECTORY}/${R2} -n ${ID} -p 16 -o ${CONTAINER_OUTPUT_DIRECTORY}/${RELATIVE_OUTPUT_DIRECTORY} -x ${CONTAINER_DATABASE_DIRECTORY}/Contamination/chm13v2.0/chm13v2.0"

# Docker
# Version
VERSION=1.2.0

# Image
DOCKER_IMAGE="jolespin/veba_preprocess:${VERSION}"

# Run
docker run \
    --name ${NAME} \
    --rm \
    --volume ${LOCAL_WORKING_DIRECTORY}:${CONTAINER_INPUT_DIRECTORY}:ro \
    --volume ${LOCAL_OUTPUT_PARENT_DIRECTORY}:${CONTAINER_OUTPUT_DIRECTORY}:rw \
    --volume ${LOCAL_DATABASE_DIRECTORY}:${CONTAINER_DATABASE_DIRECTORY}:ro \
    ${DOCKER_IMAGE} \
    -c "${CMD}"

字符串
我试图通过Fargate使用AWS Batch执行此确切命令,但无法确定作业定义。有人能帮我做到这一点吗?

{
  "jobDefinitionName": "preprocess__35",
  "type": "container",
  "containerProperties": {
    "image": "docker.io/jolespin/veba_preprocess:1.2.0",
    "command": [
      "preprocess.py",
      "-1",
      "/volumes/input/35_R1.fq.gz",
      "-2",
      "/volumes/input/35_R2.fq.gz",
      "-n",
      "35",
      "-o",
      "/volumes/output/veba_output/preprocess",
      "-p",
      "16"
    ],
    "jobRoleArn": "arn:aws:iam::xxx:role/ecsTaskExecutionRole",
    "executionRoleArn": "arn:aws:iam::xxx:role/ecsTaskExecutionRole",
    "volumes": [
      {
        "name": "efs-volume-input",
        "efsVolumeConfiguration": {
          "fileSystemId": "fs-xxx",
      "transitEncryption": "ENABLED",
          "rootDirectory": "/mnt/efs/Fastq/"
        }
      },
      {
        "name": "efs-volume-output",
        "efsVolumeConfiguration": {
          "fileSystemId": "fs-xxx",
          "transitEncryption": "ENABLED",
          "rootDirectory": "/mnt/efs/veba_output"
        }
      }
    ],
    "mountPoints": [
      {
        "sourceVolume": "efs-volume-input",
        "containerPath": "/volumes/input",
        "readOnly": true
      },
      {
        "sourceVolume": "efs-volume-output",
        "containerPath": "/volumes/output",
        "readOnly": false
      }
    ],
    "environment": [],
    "ulimits": [],
    "resourceRequirements": [
      {
        "value": "16.0",
        "type": "VCPU"
      },
      {
        "value": "122880",
        "type": "MEMORY"
      }
    ],
    "networkConfiguration": {
      "assignPublicIp": "ENABLED"
    },
    "fargatePlatformConfiguration": {
      "platformVersion": "LATEST"
    },
    "ephemeralStorage": {
      "sizeInGiB": 40
    }
  },
  "tags": {
    "Name": "preprocess__35"
  },
  "platformCapabilities": [
    "FARGATE"
  ]
}

如何指定要Map到容器中卷的已装载EFS路径?

这些都不能解决我的问题:
AWS Batch: mount an efs volume into a container using cloud formation
Mounting a volume for AWS Batch

我得到的错误如下(没有日志文件):

ResourceInitializationError:无法调用EFS utils命令来设置EFS卷:stderr:b'mount.nfs4:挂载127.0.0.1:/mnt/efs/Fastq/失败,原因由服务器给出:没有这样的文件或目录':不成功的EFS utils命令执行;产品编号:32

6uxekuva

6uxekuva1#

资源:https://docs.aws.amazon.com/batch/latest/userguide/job_definition_parameters.html#containerProperties
1)当您使用dockerhub公共镜像时,只需使用镜像的名称并将您的作业放置在具有允许访问互联网的出口规则的安全组中(0.0.0.0/0):

"container": {
    "image": "jolespin/veba_preprocess:1.2.0",
    ...
]

字符串
2和3)
当您想要使用EFS卷时,第一步是使用volumes属性定义卷,就像您已经做的那样。

"volumes": [
  {
    "name": "efs-volume",
    "efsVolumeConfiguration": {
      "fileSystemId": "fs-xxxxxxxxxx",
      "rootDirectory": "/",
      "transitEncryption": "DISABLED"
    }
  },
 ...
]


在此配置中,卷的名称为**“efs-volume”,这是我们将用于将卷附加到容器的名称。而rootDirectory是卷将使用的efs中的文件夹,在本例中为根/
第二步是定义
mountPoints**,这是将上一个卷附加到容器的属性。

"mountPoints": [
  {
    "containerPath": "/internal/path1",
    "readOnly": false,
    "sourceVolume": "efs-volume"
  },
 ...
]


上面的示例将efs“/”挂载到容器“/internal/path 1”中
因此,由于volumes属性是一个数组,因此您可以使用不同的rootDirectory创建尽可能多的卷,并使用mountPoint(使用不同的containerPath)将它们绑定到容器。
注意事项:
网络配置:
作业安全组必须具有到2049端口(tcp)中EFS安全组的出口规则
作业子网必须与efs具有装载目标的地方相同...

相关问题