本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
教程:使用阵列作业索引控制作业差异
本教程介绍如何使用 AWS_BATCH_JOB_ARRAY_INDEX
环境变量(所分配的每个子作业)来区分子作业。本示例使用子作业的索引数量读取文件中的特定行。然后,它用作业的容器内的命令替换与该行号关联的参数。结果是你可以有多个Amazon Batch运行相同的 Docker 映像和命令参数的作业。但是,结果不同,因为数组作业索引被用作修饰符。
在本教程中,您将创建一个文本文件,该文件包含了彩虹的所有颜色,并且每种颜色单独占一行。然后,您将为 Docker 容器创建一个入口点脚本,该脚本会将索引转换为可用于颜色文件中的行号的值。该指数从零开始,但行号从一开始。创建一个 Dockerfile,该文件会将颜色和索引文件复制到容器映像并设置ENTRYPOINT
将图像转换为入口点脚本。Dockerfile 和资源将生成为一个 Docker 映像并被推送到 Amazon ECR。然后,您应注册使用新容器映像的作业定义,提交具有该作业定义的 Amazon Batch 数组作业并查看结果。
先决条件
本教程包含以下先决条件:
-
一个 Amazon Batch 计算环境。有关更多信息,请参阅 创建计算环境。
-
一个 Amazon Batch 作业队列和关联的计算环境。有关更多信息,请参阅 创建作业队列。
-
在本地系统上安装的 Amazon CLI。有关更多信息,请参阅 Amazon Command Line Interface 用户指南中的安装 Amazon Command Line Interface。
-
在本地系统上安装的 Docker。有关更多信息,请参阅 Docker 文档中的关于 Docker CE
。
第 1 步:构建容器映像
您可以使用AWS_BATCH_JOB_ARRAY_INDEX
在命令参数中的作业定义. 但是,我们建议您创建一个在入口点脚本中使用变量的容器映像。本节介绍如何创建此类容器映像。
构建 Docker 容器映像
-
创建要用作 Docker 映像工作区的新目录并导航到该目录。
-
创建一个名为的文件
colors.txt
将以下内容粘贴到其中。red orange yellow green blue indigo violet
-
创建一个名为的文件
print-color.sh
将以下内容粘贴到其中。注意 LINE
变量被设置为AWS_BATCH_JOB_ARRAY_INDEX
+ 1,因为数组索引从 0 开始,但行号从 1 开始。这些区域有:COLOR
将变量设置为中的颜色colors.txt
这与它的行号有关。#!/bin/sh LINE=$((AWS_BATCH_JOB_ARRAY_INDEX + 1)) COLOR=$(sed -n ${LINE}p /tmp/colors.txt) echo My favorite color of the rainbow is $COLOR.
-
创建一个名为的文件
Dockerfile
将下面的内容粘贴到其中。此 Dockerfile 会将以前的文件复制到您的容器并设置要在容器启动时运行的入口点脚本。FROM busybox COPY print-color.sh /tmp/print-color.sh COPY colors.txt /tmp/colors.txt RUN chmod +x /tmp/print-color.sh ENTRYPOINT /tmp/print-color.sh
-
生成 Docker 映像:
docker build -t print-color .
-
使用以下脚本测试容器。此脚本设置
AWS_BATCH_JOB_ARRAY_INDEX
在本地变量为 0,然后递增它以模拟具有 7 个子级的数组作业。确实.AWS_BATCH_JOB_ARRAY_INDEX=0 while [ $AWS_BATCH_JOB_ARRAY_INDEX -le 6 ] do docker run -e AWS_BATCH_JOB_ARRAY_INDEX=$AWS_BATCH_JOB_ARRAY_INDEX print-color AWS_BATCH_JOB_ARRAY_INDEX=$((AWS_BATCH_JOB_ARRAY_INDEX + 1)) done
下面是输出。
My favorite color of the rainbow is red. My favorite color of the rainbow is orange. My favorite color of the rainbow is yellow. My favorite color of the rainbow is green. My favorite color of the rainbow is blue. My favorite color of the rainbow is indigo. My favorite color of the rainbow is violet.
第 2 步:将映像推送到 Amazon ECR
既然您已构建并测试 Docker 容器,请将其推送到映像存储库。本示例使用 Amazon ECR,但您可以使用其他注册表,例如 DockerHub。
-
创建用于存储您的容器映像的 Amazon ECR 映像存储库。此示例只使用Amazon CLI但是您也可以使用Amazon Web Services Management Console. 有关更多信息,请参阅 。创建存储库中的Amazon Elastic Container Registry Useristry.
aws ecr create-repository --repository-name print-color
-
为 添加标签
print-color
映像带有从上一步返回的 Amazon ECR 存储库 URI 标记映像。docker tag print-color
aws_account_id
.dkr.ecr.region
.amazonaws.com/print-color -
登录到您的 Amazon ECR 注册表。有关更多信息,请参阅 Amazon Elastic Container Registry 用户指南中的注册表身份验证。
aws ecr get-login-password --region
region
| docker login --username AWS \ --password-stdinaws_account_id
.dkr.ecr.region
.amazonaws.com -
将映像推送到 Amazon ECR:
docker push
aws_account_id
.dkr.ecr.region
.amazonaws.com/print-color
第 3 步:创建并注册作 Job 定义
既然您的 Docker 映像位于映像注册表中,您可以在Amazon Batch任务定义。然后,您可以稍后使用它来运行阵列作业。此示例只使用Amazon CLI. 但是,您也可以使用Amazon Web Services Management Console. 有关更多信息,请参阅 创建单节点作业定义 。
创建作业定义
-
创建一个名为的文件
print-color-job-def.json
将以下内容粘贴到其中。将映像存储库 URI 替换为您自己的映像的 URI。{ "jobDefinitionName": "print-color", "type": "container", "containerProperties": { "image": "
aws_account_id
.dkr.ecr.region
.amazonaws.com/print-color", "resourceRequirements": [ { "type": "MEMORY", "value": "250" }, { "type": "VCPU", "value": "1" } ] } } -
使用 Amazon Batch 注册作业定义:
aws batch register-job-definition --cli-input-json file://print-color-job-def.json
第 4 步:提交Amazon Batch数组作业
在注册作业定义后,您可以提交Amazon Batch使用新容器镜像的数组作业。
提交 Amazon Batch 数组作业
-
创建一个名为的文件
print-color-job.json
将以下内容粘贴到其中。注意 本示例假设由创建的默认作业队列名称。Amazon Batch首次运行向导。如果您的作业队列名称不同,请将
first-run-job-queue
名称替换为您的作业队列名称。{ "jobName": "print-color", "jobQueue": "
first-run-job-queue
", "arrayProperties": { "size": 7 }, "jobDefinition": "print-color" } -
将作业提交到 Amazon Batch 作业队列。记下在输出中返回的作业 ID。
aws batch submit-job --cli-input-json file://print-color-job.json
-
描述作业的状态并等待作业移动到
SUCCEEDED
。
第 5 步:查看阵列作业日志
在你的工作到达之后SUCCEEDED
状态,你可以查看 CloudWatch 来自作业容器的日志。
在 中查看作业的日志 CloudWatch 日志
打开Amazon Batch控制台https://console.aws.amazon.com/batch/
. -
在左侧导航窗格中,选择 Jobs (作业)。
-
对于 Job queue(作业队列),选择一个队列。
-
在 Status (状态) 部分中,选择 succeeded (已成功)。
-
要显示数组作业的所有子作业,请选择在上一节中返回的作业 ID。
-
要从作业的容器查看日志,请选择其中一个子作业,然后选择 View logs (查看日志)。
-
查看其他子作业的日志。每个作业将分别返回彩虹的一种颜色。