View a markdown version of this page

创建新版本的容器配方 - EC2 Image Builder

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

创建新版本的容器配方

本节向您介绍如何创建容器配方或现有配方的新版本。容器配方定义了三个关键元素:基础镜像、构建组件和目标存储库。使用此配方生成映像生成Docker器存储在 Amazon ECR 中的容器映像。

使用控制台创建新的容器配方版本

创建新版本的容器配方与创建新配方几乎相同。不同之处在于,在大多数情况下,为匹配基础配方,某些详细信息都是预先选择的。以下列表描述创建新配方和创建现有配方的新版本之间的区别。

配方详细信息
  • 名称 - 不可编辑

  • 版本 - 必填。此详细信息未预先填充当前版本或任何类型的序列。以 major.minor.patch 格式输入要创建的版本号。如果版本已经存在,映像生成器将返回错误。

基础 映像
  • 选择图像选项 — Pre-selected,但可编辑。如果您更改对基础映像来源的选择,则可能会丢失其他详细信息,这些详细信息取决于您选择的原始选项。

    对于Docker容器镜像,您可以选择托管的公共映像DockerHub、Amazon ECR 中的现有容器镜像或 Amazon-managed 容器镜像。要查看与您的基础映像选择相关的详细信息,请选择与您的选择相匹配的选项卡。

    Managed images
    • 映像操作系统 (OS) - 不可编辑

    • 图像名称 — Pre-selected,基于您为现有配方所做的基本图像选择组合。但是,如果您更改选择映像选项,则会丢失预先选择的映像名称

    • Auto-versioning 选项 与您的基本配方不匹配。Auto-versioning 选项默认为 “使用所选操作系统版本” 选项。

      重要

      如果您使用语义版本控制来启动管道构建,请确保将此值更改为使用最新的可用操作系统版本。要了解有关 Image Builder 资源的语义版本控制的更多信息,请参阅Image Builder 中的语义版本控制

    ECR image
    • 图像操作系统 (OS) —Pre-selected,但可编辑。

    • 操作系统版本 — Pre-selected,但可编辑。

    • ECR 图像 ID — Pre-filled,但可编辑。

    Docker Hub image
    • 映像操作系统 (OS) - 不可编辑

    • 操作系统版本 — Pre-selected,但可编辑。

    • Docker图片 ID — Pre-filled,但可编辑。

实例配置
  • AMI 来源(必填)-确定一个自定义 AMI,用作容器构建和测试实例的基础镜像。这可以是 AMI ID 或包含 AMI ID 的 AWS Systems Manager (SSM) 参数存储参数。

    • AMI ID — 此设置未预先填入您的原始条目。输入基础映像的 AMI ID。示例:ami-1234567890abcdef1

    • SSM 参数 — 输入包含基础映像的 AMI ID 的 SSM 参数存储参数的名称或 ARN。示例:/ib/test/paramarn:aws:ssm:us-east-1:111122223333:parameter/ib/test/param

  • 存储(卷)

    EBS 卷 1(AMI 根目录)— Pre-filled. 您无法编辑根卷设备名称快照IOPS 选项。但是,您可以更改所有其余设置,例如大小。您还可以添加新卷。

    注意

    如果您指定了从另一个账户共享的基本 AMI,则指定的任何辅助卷的快照还必须与您的账户共享。

工作目录
  • 工作目录路径 — Pre-filled,但可编辑。

组件
  • 组件 - 已包含在配方中的组件显示在每个组件列表(构建和测试)末尾的选定组件部分中。您可以移除所选组件或对其重新排序,以满足您的需要。

    CIS 加固组件未遵循 Image Builder 配方中的标准组件排序规则。CIS 强化组件始终最后运行,以确保基准测试针对您的输出映像运行。

    注意

    构建和测试组件列表根据组件所有者类型显示可用组件。要添加组件,请选择添加编译组件,然后选择适用的所有权筛选条件。例如,要添加与 AWS Marketplace 产品关联的构建组件,请选择AWS Marketplace。这将在控制台界面右侧打开一个列出 AWS Marketplace 组件的选择面板。

    对于 CIS 组件,选择Third party managed

    您可以为自己的所选组件配置以下设置:

    • 版本控制选项 — Pre-selected,但您可以对其进行更改。我们建议您选择使用最新的可用组件版本选项,以确保您的映像版本始终使用最新版本的组件。如果您需要在配方中使用特定的组件版本,则可以选择指定组件版本,然后在出现的组件版本框中输入版本。

    • 输入参数 - 显示组件接受的输入参数。该预先填充了配方先前版本中的值。如果您在此配方中首次使用此组件,并且已为该输入参数定义了默认值,则默认值以灰色文本显示在框中。如果未输入其他值,Image Builder 将使用默认值。

      如果需要输入参数,但组件中未定义默认值,则必须提供一个值。如果缺少任何必需的参数且未定义默认值,Image Builder 将不会创建配方版本。

      重要

      组件参数是纯文本值,并且已记录在 AWS CloudTrail中。我们建议您使用 AWS Secrets Manager 或 AWS Systems Manager 参数存储来存储您的密钥。有关 Secrets Manager 的更多信息,请参阅AWS Secrets Manager 用户指南中的什么是 Secrets Manager?。有关 AWS Systems Manager Parameter Store 的更多信息,请参阅《AWS Systems Manager 用户指南》中的AWS Systems Manager Parameter Store

    要展开版本控制选项输入参数的设置,可以选择设置名称旁边的箭头。要展开所有选定组件的所有设置,可以关闭和打开全部展开开关。

Dockerfile 模板
  • Dockerfile 模板 — Pre-filled,但可编辑。您可以指定以下任意上下文变量,Image Builder 在运行时将这些变量替换为构建信息。

     

    parentImage(必需)

    在构建时,此变量会解析为配方的基础映像。

    示例:

    FROM {{{ imagebuilder:parentImage }}}
    environments(如果指定了组件,则为必需)

    在构建时,此变量解析为 Dockerfile 指令,将您的组件存放在构建上下文中。这些指令将组件脚本复制到镜像中,并设置这些脚本使用的环境变量。它可以准备环境,但不运行您指定的组件。将此变量放在components变量之前。

    示例:

    {{{ imagebuilder:environments }}}
    components(可选)

    在编译时,此变量解析为运行容器配方所包含组件的构建和测试组件脚本的命令,然后将这些脚本从镜像中移除。这是运行组件的变量。将其放在environments变量之后。

    示例:

    {{{ imagebuilder:components }}}
目标存储库
  • 目标存储库名称 – 如果您的管道的分发配置中没有为管道运行区域(区域 1)指定其他存储库,则输出映像存储在 Amazon ECR 存储库。

创建新的容器配方版本:
  1. 在容器配方详细信息页面上,选择页面顶部的创建新版本。控制台为容器配方打开创建配方页面。

  2. 要创建新版本,请进行更改,然后选择Create recipe(创建配方)。

有关步骤 2:选择配方在创建映像管道时创建容器配方的更多信息,请参阅本指南的入门部分。

使用创建容器配方 AWS CLI

要使用中的imagebuilder create-container-recipe命令创建映像生成器容器配方 AWS CLI,请执行以下步骤:

先决条件

在运行本节中的映像生成器命令以使用创建容器配方之前 AWS CLI,必须创建配方将使用的组件。以下步骤中的容器配方示例引用了在本指南 从中创建自定义组件 AWS CLI 章节中创建的示例组件。

创建组件后,或者如果您使用的是现有组件,请记下您想要包含在配方中的 ARN。

  1. 创建 CLI 输入 JSON 文件

    您可以使用内联命令参数为 create-container-recipe 命令提供所有输入。但是,生成的命令可能会很长。为了简化命令,您可以改为提供一个包含所有容器配方设置的 JSON 文件

    注意

    JSON 文件中数据值的命名惯例遵循为映像生成器 API 操作请求参数指定的模式。要查看 API 操作请求参数,请参阅 EC2 映像生成器 API 参考中的CreateContainerRecipe命令

    要将数据值作为命令行参数提供,请参阅《AWS CLI 命令引用》中指定的参数名称。

    以下是此示例中参数的摘要:

    • 组件(对象数组,可选)-包含ComponentConfiguration对象数组。对于容器配方,组件是可选的。你可以使用 BUILD 组件自定义输出镜像,在 Dockerfile 模板中添加指令(例如RUNCOPY语句),或两者兼而有之。测试组件会验证图像但不对其进行修改。

      注意

      Image Builder 按照您在配方中指定的顺序安装组件。但是,CIS 强化组件始终最后运行,以确保基准测试针对您的输出映像运行。

      • componentARN(字符串,必填)– 组件 ARN。

        提示

        要使用该示例创建您自己的容器配方,请将示例 ARN 替换为您用于配方的组件的 ARN。其中包括每个版本的 AWS 区域、名称和版本号。

      • 参数(对象数组)- 包含 ComponentParameter 对象数组。如果需要输入参数,但组件中未定义默认值,则必须提供一个值。如果缺少任何必需的参数且未定义默认值,Image Builder 将不会创建配方版本。

        重要

        组件参数是纯文本值,并且已记录在 AWS CloudTrail中。我们建议您使用 AWS Secrets Manager 或 AWS Systems Manager 参数存储来存储您的密钥。有关 Secrets Manager 的更多信息,请参阅AWS Secrets Manager 用户指南中的什么是 Secrets Manager?。有关 AWS Systems Manager Parameter Store 的更多信息,请参阅《AWS Systems Manager 用户指南》中的AWS Systems Manager Parameter Store

        • 名称(字符串,必填)- 要设置的组件参数的名称。

        • (字符串数组,必填)- 包含用于设置指定组件参数值的字符串数组。如果为组件定义了默认值且未提供其他值,则 AWSTOE 使用该默认值。

    • containerType(字符串,必填)- 要创建的容器的类型。有效值包括 DOCKER

    • dockerfile TemplateData(字符串)— 用于构建镜像的内联 Dockerfile 模板。行内数据限制为 16,000 个字符。您必须指定 dockerfileTemplateDatadockerfileTemplateUri,但不能同时指定两者。

      您的 Dockerfile 模板可以包含上下文变量(映像生成器在运行时用编译信息替换的占位符)。至少包括parentImage变量。如果您的配方包含成分,还要包括environments变量和components变量。

      parentImage(必需)

      在构建时,此变量会解析为配方的基础映像。

      示例:

      FROM {{{ imagebuilder:parentImage }}}
      environments(如果指定了组件,则为必需)

      在构建时,此变量解析为 Dockerfile 指令,将您的组件存放在构建上下文中。这些指令将组件脚本复制到镜像中,并设置这些脚本使用的环境变量。它可以准备环境,但不运行您指定的组件。将此变量放在components变量之前。

      示例:

      {{{ imagebuilder:environments }}}
      components(可选)

      在编译时,此变量解析为运行容器配方所包含组件的构建和测试组件脚本的命令,然后将这些脚本从镜像中移除。这是运行组件的变量。将其放在environments变量之后。

      示例:

      {{{ imagebuilder:components }}}

      要改为将模板存储在亚马逊 S3 中,请使用带有有效亚马逊 S3 URI 的 dockerfile TemplateUri 参数(例如,s3://my-bucket/templates/Dockerfile)。

    • 名称(字符串,必填)- 容器配方的名称。

    • 描述(字符串)- 容器配方的描述。

    • parentImage(字符串,必填)-Docker 容器配方中用作自定义图像基准的容器映像。

      • 托管的公开图片 DockerHub

      • 亚马逊 ECR 中的现有容器镜像

      • Amazon-managed 容器镜像

    • platformOverride(字符串)– 指定使用自定义基础映像时的操作系统平台。我们建议您在使用Docker Hub或 Amazon ECR 图像时设置此值。如果你省略它,Image Builder 会尝试从容器清单中检测平台,但容器清单可能并不总是可用的。您无法指定您的父映像platformOverride何时是映像生成器映像 ARN。有效值为 LinuxWindows。容器配方不支持 macOS 平台。

    • semanticVersion(字符串,必填)– 容器配方的语义版本按以下格式指定,每个位置都有数值以表示特定版本:<major>.<minor>.<patch>。例如,1.0.0 就是一个示例。要了解有关 Image Builder 资源的语义版本控制的更多信息,请参阅Image Builder 中的语义版本控制

    • 标签(字符串映射)– 附加到容器配方的标签。

    • instanceConfiguration(对象)– 可用于配置实例以构建和测试容器映像的一组选项。

      • image(字符串)-容器构建和测试实例的基础镜像。它可以包含 AMI ID,也可以指定 AWS Systems Manager (SSM) 参数存储参数,前缀为参数名称或 ARN。ssm:如果您使用 SSM 参数,则参数值必须包含 AMI ID。如果您未指定基础映像,映像生成器将使用相应的 Amazon ECS 优化的 AMI 作为基础映像。

      • 块 DeviceMappings(对象数组)-定义要连接的块储存设备,用于从image参数中指定的映像生成器 AMI 构建实例。

        • deviceName(字符串)- 这些映射适用的设备。

        • ebs(对象)– 用于管理此映射的特定于 Amazon EBS 的配置。

          • 删除 OnTermination(布尔值)-用于配置关联设备终止时删除。

          • 已加密(布尔值)- 用于配置设备加密。

          • volumeSize(整数)- 用于覆盖设备的卷大小。

          • volumeType(字符串)- 用于覆盖设备的卷类型。

    • targetRepository(对象,必填)– 如果管道的分发配置中没有为管道运行区域(区域 1)指定其他存储库,则为容器映像的目标存储库。

      • repositoryName(字符串,必填)– 存储输出容器映像的容器存储库的名称。此名称以存储库位置作为前缀。

      • 服务(字符串,必填)-指定存储输出图像的存储库服务。有效值为 ECR。目标存储库必须已经存在。

    • workingDirectory(字符串)– 构建和测试工作流期间使用的工作目录。

    以下示例显示了一个完整的容器配方输入文件,该文件定义了带有构建组件的 Linux Docker 容器。将其另存为create-container-recipe.json,然后在create-container-recipe命令中使用。

    { "components": [ { "componentArn": "arn:aws:imagebuilder:us-west-2:111122223333:component/helloworldal2/x.x.x" } ], "containerType": "DOCKER", "description": "My Linux Docker container image", "dockerfileTemplateData": "FROM {{{ imagebuilder:parentImage }}}\n{{{ imagebuilder:environments }}}\n{{{ imagebuilder:components }}}", "name": "amazonlinux-container-recipe", "parentImage": "amazonlinux:latest", "platformOverride": "Linux", "semanticVersion": "1.0.2", "tags": { "sometag" : "Tag detail" }, "instanceConfiguration": { "image": "ami-1234567890abcdef1", "blockDeviceMappings": [ { "deviceName": "/dev/xvda", "ebs": { "deleteOnTermination": true, "encrypted": false, "volumeSize": 8, "volumeType": "gp2" } } ] }, "targetRepository": { "repositoryName": "myrepo", "service": "ECR" }, "workingDirectory": "/tmp" }
  2. 创建配方

    使用以下命令以创建配方。在 --cli-input-json 参数中提供您在上一步中创建的 JSON 文件的名称:

    aws imagebuilder create-container-recipe --cli-input-json file://create-container-recipe.json
    注意
    • JSON 文件路径开头必须包含 file:// 符号。

    • JSON 文件的路径应遵循运行命令的基本操作系统的相应约定。例如,Windows 使用反斜杠 (\) 引用目录路径,而 Linux 和 macOS 使用正斜杠 (/)。

    以下示例输出显示了新创建的容器配方的 ARN 以及请求的请求 ID 和客户端令牌。

    { "requestId": "a1b2c3d4-5678-90ab-cdef-EXAMPLE11111", "clientToken": "a1b2c3d4-5678-90ab-cdef-EXAMPLE22222", "containerRecipeArn": "arn:aws:imagebuilder:us-west-2:123456789012:container-recipe/my-container-recipe/1.0.2" }

容器配方限制

在创建容器配方之前,请查看以下限制:

  • 您必须指定已经存在的目标 Amazon ECR 存储库。

  • AWS Marketplace 容器配方中不支持组件。

  • 组件是可选的。你可以使用 BUILD 组件自定义输出镜像,在 Dockerfile 模板中添加指令(例如RUNCOPY语句),或两者兼而有之。测试组件会验证图像但不对其进行修改。

  • 容器配方不支持 macOS 平台。

  • 对于 Dockerfile 模板,请提供行内数据(最多 16,000 个字符)或 Amazon S3 URI。但不能同时指定两者。

  • 累积配方大小不能超过 25 KB。如果您收到大小错误,请减少组件参数的数量或缩短参数值。此限制与 Dockerfile 模板大小限制是分开的。

  • 设置platformOverride为时Windows,还必须指定imageOsVersionOverride。这适用于任何非映像生成器父映像,例如 Amazon ECR 图像或图像。Docker Hub

常见错误和故障排除

下表列出了您在创建容器配方时可能遇到的常见错误以及如何解决这些错误。

错误 原因 解决方案
“容器配方不得包含商城组件” 容器配方中的一个 AWS Marketplace 组件。 仅使用非AWS Marketplace 组件。
“容器配方目前不支持 macOS 平台” platformOverride设置为 macOS。 使用 LinuxWindows
“你必须指定 dockerfile TemplateData 或 dockerfile” TemplateUri 您指定了两者或两者都不指定。 只提供一个。
“无效的 S3 URI” 中的dockerfileTemplateUri亚马逊 S3 路径格式不正确。 采用格式 s3://bucket/key
“使用映像生成器映像作为父映像时,您无法指定平台替代项” platformOverride使用映像生成器映像 ARN。 删除 platformOverride。映像生成器从父图像元数据中检测平台。
“使用 ECR 存储库作为 Windows 平台的父映像时,必须指定映像 OsVersion 覆盖” platformOverride没有操作系统版本的 Windows。 添加该imageOsVersionOverride字段。