

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

# 创建新版本的容器配方
<a name="create-container-recipes"></a>

本节展示了如何创建创建新版本的容器配方。

**Topics**
+ [使用控制台创建新的容器配方版本](#create-container-recipe-version)
+ [使用创建容器配方 AWS CLI](#create-container-recipe-cli)

## 使用控制台创建新的容器配方版本
<a name="create-container-recipe-version"></a>

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

**配方详细信息**
+ **名称** - *不可编辑*。
+ **版本** - 必填。此详细信息未预先填充当前版本或任何类型的序列。以 *major.minor.patch* 格式输入要创建的版本号。如果该版本已经存在，则会遇到错误。

**基础映像**
+ **选择映像**选项 - 预先选择，但可以编辑。如果您更改对基础映像来源的选择，则可能会丢失其他详细信息，这些详细信息取决于您选择的原始选项。

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

------
#### [ Managed images ]
  + **映像操作系统 (OS)** - *不可编辑*。
  + **映像名称** - 根据您为现有配方所做的基础映像选择的组合进行预先选择。但是，如果您更改**选择映像**选项，则会丢失预先选择的**映像名称**。
  + **自动版本控制选项** - 与您的基础配方*不*匹配。自动版本控制选项默认为**使用选定的操作系统版本**选项。
**重要**  
如果您使用语义版本控制来启动管道构建，请确保将此值更改为**使用最新的可用操作系统版本**。要了解有关 Image Builder 资源的语义版本控制的更多信息，请参阅[Image Builder 中的语义版本控制](ibhow-semantic-versioning.md)。

------
#### [ ECR image ]
  + **映像操作系统 (OS)** - 预先选择，但可编辑。
  + **操作系统版本** - 预先选择，但可编辑。
  + **ECR 映像 ID** – 已预先填充，但可编辑。

------
#### [ Docker Hub image ]
  + **映像操作系统 (OS)** - *不可编辑*。
  + **操作系统版本** - 预先选择，但可编辑。
  + **Docker 映像 ID** – 已预先填充，但可以编辑。

------

**实例配置**
+ **AMI 来源**（必填）-确定要用作容器构建和测试实例基础映像的自定义 AMI。这可以是 AMI ID 或包含 AMI ID 的 AWS Systems Manager (SSM) 参数存储参数。
  + **AMI ID** — 此设置未预先填入您的原始条目。输入您的基础映像的 AMI ID。示例：`ami-1234567890abcdef1`。
  + **SSM 参数**-输入包含基础映像的 AMI ID 的 SSM 参数存储参数的名称或 ARN。示例：`/ib/test/param` 或 `arn:aws:ssm:us-east-1:111122223333:parameter/ib/test/param`。
+ 

**存储（卷）**  
**EBS 第 1 卷（AMI 根）**— 已预先填充。您无法编辑根卷**设备名称**、**快照**或 **IOPS** 选项。但是，您可以更改所有其余设置，例如**大小**。您还可以添加新卷。
**注意**  
如果您指定了从另一个账户共享的基本 AMI，则指定的任何辅助卷的快照还必须与您的账户共享。

**工作目录**
+ **工作目录路径** – 已预先填充，但可编辑。

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

  CIS 加固组件未遵循 Image Builder 配方中的标准组件排序规则。CIS 强化组件始终最后运行，以确保基准测试针对您的输出映像运行。
**注意**  
构建和测试组件列表根据组件所有者类型显示可用组件。要添加组件，请选择**添加构建组件**，然后选择适用的所有权筛选器。例如，要添加与 AWS Marketplace 产品关联的构建组件，请选择`AWS Marketplace`。这将在控制台界面的右侧打开一个列出 AWS Marketplace 组件的选择面板。  
对于 CIS 组件，请选择`Third party managed`。

  您可以为自己的所选组件配置以下设置：
  + **版本控制选项** - 已预先选择，但您可以对其进行更改。我们建议您选择**使用最新的可用组件版本**选项，以确保您的映像版本始终使用最新版本的组件。如果您需要在配方中使用特定的组件版本，则可以选择**指定组件版本**，然后在出现的**组件版本**框中输入版本。
  + **输入参数** - 显示组件接受的输入参数。该**值**预先填充了配方先前版本中的值。如果您在此配方中首次使用此组件，并且已为该输入参数定义了默认值，则默认值以灰色文本显示在**值**框中。如果未输入其他值，Image Builder 将使用默认值。

    如果需要输入参数，但组件中未定义默认值，则必须提供一个值。如果缺少任何必需的参数且未定义默认值，Image Builder 将不会创建配方版本。
**重要**  
组件参数是纯文本值，并且已记录在 AWS CloudTrail中。我们建议您使用 AWS Secrets Manager 或 P AWS Systems Manager arameter Store 来存储您的密钥。有关 Secrets Manager 的更多信息，请参阅*AWS Secrets Manager 用户指南*中的[什么是 Secrets Manager?](https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html)。有关 AWS Systems Manager Parameter Store 的更多信息，请参阅*《AWS Systems Manager 用户指南》*中的[AWS Systems Manager Parameter Store](https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-parameter-store.html)。

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

**Dockerfile 模板**
+ **Dockerfile 模板** – 已预先填充，但可编辑。您可以指定以下任意上下文变量，Image Builder 在运行时将这些变量替换为构建信息。

     
**parentImage（必需）**  
在构建时，此变量会解析为配方的基础映像。  
示例：  

  ```
  FROM
  {{{ imagebuilder:parentImage }}}
  ```  
**environments（如果指定了组件，则为必需）**  
此变量将解析为运行组件的脚本。  
示例：  

  ```
  {{{ imagebuilder:environments }}}
  ```  
**components（可选）**  
Image Builder 解析容器配方中包含的组件的构建和测试组件脚本。此变量可以置于 Dockerfile 中的任意位置，在 environments 变量之后。  
示例：  

  ```
  {{{ imagebuilder:components }}}
  ```

**目标存储库**
+ **目标存储库名称** – 如果您的管道的分发配置中没有为管道运行区域（区域 1）指定其他存储库，则输出映像存储在 Amazon ECR 存储库。

**创建新的容器配方版本：**

1. 在容器配方详细信息页面的顶部，选择**Create new version**（创建新版本）。您将进入容器配方的**创建配方**页面。

1. 要创建新版本，请进行更改，然后选择**Create recipe**（创建配方）。

有关如何在创建映像管道时创建容器配方的更多信息，请参阅本指南的**入门**章节中的[步骤 2：选择配方](start-build-container-pipeline.md#start-build-container-step2)。

## 使用创建容器配方 AWS CLI
<a name="create-container-recipe-cli"></a>

要使用中的`imagebuilder create-container-recipe`命令创建 Image Builder 容器配方 AWS CLI，请执行以下步骤：

**先决条件**  
在运行本节中的 Image Builder 命令使用创建容器配方之前 AWS CLI，必须创建配方将使用的组件。以下步骤中的容器配方示例引用了在本指南 [从中创建自定义组件 AWS CLI](create-component.md#create-component-ib-cli) 章节中创建的示例组件。

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

1. 

**创建 CLI 输入 JSON 文件**

   您可以使用内联命令参数为 **create-container-recipe** 命令提供所有输入。但是，生成的命令可能会很长。为了简化命令，您可以改为提供一个包含所有容器配方设置的 JSON 文件
**注意**  
JSON 文件中数据值的命名约定遵循为 Image Builder API 操作请求参数指定的模式。要查看 API 操作请求参数，请参阅《*EC2 Image Builder API 参考*》中的[CreateContainerRecipe](https://docs.aws.amazon.com/imagebuilder/latest/APIReference/API_CreateContainerRecipe.html)命令。  
要将数据值作为命令行参数提供，请参阅《*AWS CLI 命令引用*》中指定的参数名称。

   以下是此示例中参数的摘要：
   + **组件**（对象数组，必填）- 包含 `ComponentConfiguration` 对象数组。必须指定至少一个构建组件：
**注意**  
Image Builder 按照您在配方中指定的顺序安装组件。但是，CIS 强化组件始终最后运行，以确保基准测试针对您的输出映像运行。
     + **componentARN**（字符串，必填）– 组件 ARN。
**提示**  
要使用该示例来创建自己的容器配方，请将该 ARNs 示例 ARNs 替换为用于配方的组件。其中包括每个版本的 AWS 区域、名称和版本号。
     + **参数**（对象数组）- 包含 `ComponentParameter` 对象数组。如果需要输入参数，但组件中未定义默认值，则必须提供一个值。如果缺少任何必需的参数且未定义默认值，Image Builder 将不会创建配方版本。
**重要**  
组件参数是纯文本值，并且已记录在 AWS CloudTrail中。我们建议您使用 AWS Secrets Manager 或 P AWS Systems Manager arameter Store 来存储您的密钥。有关 Secrets Manager 的更多信息，请参阅*AWS Secrets Manager 用户指南*中的[什么是 Secrets Manager?](https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html)。有关 AWS Systems Manager Parameter Store 的更多信息，请参阅*《AWS Systems Manager 用户指南》*中的[AWS Systems Manager Parameter Store](https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-parameter-store.html)。
       + **名称**（字符串，必填）- 要设置的组件参数的名称。
       + **值**（字符串数组，必填）- 包含用于设置指定组件参数值的字符串数组。如果为组件定义了默认值，但未提供其他值，则 AWSTOE 使用默认值。
   + **containerType**（字符串，必填）- 要创建的容器的类型。有效值包括 `DOCKER`。
   + **dockerfileTemplateData**（字符串）— 用于构建映像的 Dockerfile 模板，表示为内联数据 blob。
   + **名称**（字符串，必填）- 容器配方的名称。
   + **描述**（字符串）- 容器配方的描述。
   + p@@ **arentImag** e（字符串，必填）— 要在容器配方中用作自定义映像基线的 Docker 容器镜像。
     + 公共图片托管在 DockerHub
     + 亚马逊 ECR 中的现有容器镜像
     + 亚马逊管理的容器镜像
   + **platformOverride**（字符串）– 指定使用自定义基础映像时的操作系统平台。
   + **semanticVersion**（字符串，必填）– 容器配方的语义版本按以下格式指定，每个位置都有数值以表示特定版本：*<major>.<minor>.<patch>*。例如，`1.0.0` 就是一个示例。要了解有关 Image Builder 资源的语义版本控制的更多信息，请参阅[Image Builder 中的语义版本控制](ibhow-semantic-versioning.md)。
   + **标签**（字符串映射）– 附加到容器配方的标签。
   + **instanceConfiguration**（对象）– 可用于配置实例以构建和测试容器映像的一组选项。
     + **imag** e（字符串）— 容器构建和测试实例的基础镜像。它可以包含 AMI ID，也可以指定 AWS Systems Manager (SSM) 参数存储参数，前缀为参数名称或 ARN`ssm:`，其前缀为参数名称或 ARN。如果您使用 SSM 参数，则该参数值必须包含 AMI ID。如果您未指定基础映像，Image Builder 会使用相应的 Amazon ECS 优化的 AMI 作为基础映像。
     + **blockDeviceMappings**（对象数组）— 定义要连接的块设备，以便从**image**参数中指定的 Image Builder AMI 构建实例。
       + **deviceName**（字符串）- 这些映射适用的设备。
       + **ebs**（对象）– 用于管理此映射的特定于 Amazon EBS 的配置。
         + **deleteOnTermination**（布尔值）-用于配置关联设备终止时的删除。
         + **已加密**（布尔值）- 用于配置设备加密。
         + **volumeSize**（整数）- 用于覆盖设备的卷大小。
         + **volumeType**（字符串）- 用于覆盖设备的卷类型。
   + **targetRepository**（对象，必填）– 如果管道的分发配置中没有为管道运行区域（区域 1）指定其他存储库，则为容器映像的目标存储库。
     + **repositoryName**（字符串，必填）– 存储输出容器映像的容器存储库的名称。此名称以存储库位置作为前缀。
     + **服务**（字符串，必填）– 指定注册此映像的服务。
   + **workingDirectory**（字符串）– 构建和测试工作流期间使用的工作目录。

   ```
   {
   	"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"
   }
   ```

1. 

**创建配方**

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

   ```
   aws imagebuilder create-container-recipe --cli-input-json file://create-container-recipe.json
   ```
**注意**  
JSON 文件路径开头必须包含 `file://` 符号。
JSON 文件的路径应遵循运行命令的基本操作系统的相应约定。例如，Windows 使用反斜杠 (\$1) 引用目录路径，而 Linux 和 macOS 使用正斜杠 (/)。