

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

# 教程：使用 CodePipeline （V2 类型）构建 Docker 镜像并将其推送到亚马逊 ECR
<a name="tutorials-ecr-build-publish"></a>

本教程可帮助您在中创建一个生成操作 CodePipeline ，在更改源代码后运行您的 Docker 映像并将其推送到 Amazon ECR。本教程还向您展示了如何添加 Amazon ECS 部署操作来部署您推送的映像。

**重要**  
作为在控制台中创建管道的一部分，S3 工件存储桶将 CodePipeline 用于项目。（这与用于 S3 源操作的存储桶不同。） 如果 S3 工件存储桶与您的管道账户位于不同的账户中，请确保 S3 工件存储桶归其所有 AWS 账户 ，该存储桶是安全且可靠的。

**注意**  
本教程适用于包含 GitHub 源存储库的 CodePipeline 管道的 ECRBuildAndPublish 构建操作以及用于部署到 Amazon ECS 集群的 Amazon ECS 标准操作。有关使用带有 ECR 镜像存储库的管道作为 Amazon ECS 的 CodeDeploy 蓝/绿部署操作源的教程，请参阅。 CodePipeline [教程：使用 Amazon ECR 源和 ECS-to-CodeDeploy部署创建管道](tutorials-ecs-ecr-codedeploy.md)

**重要**  
此操作使用 CodePipeline 托管 CodeBuild 计算在构建环境中运行命令。运行 Commands 操作将在 AWS CodeBuild中产生单独的费用。

## 先决条件
<a name="tutorials-ecr-build-publish-prereqs"></a>

您必须先部署一些资源，然后才能使用本教程创建您的 CD 管道。以下是您在开始操作之前需要的资源：

**注意**  
所有这些资源都应在同一个 AWS 区域内创建。
+ 源代码控制存储库（本教程使用 GitHub），您将在其中为本教程添加以下内容：
  + 在步骤 1 中，您将向源存储库中添加一个示例 Dockerfile 作为中 ECRBuildAndPublish 构建操作的输入项目。 CodePipeline
  + 在步骤 2 中，您将向源存储库中添加一个示例 imagedefinitions.json 文件，以此作为中亚马逊 ECS 标准部署操作的要求。 CodePipeline
+ 一个 Amazon ECR 映像存储库，其中包含您基于 Dockerfile 构建的映像。有关更多信息，请参阅 *Amazon Elastic Container Registry 用户指南* 中的[创建存储库](https://docs.aws.amazon.com/AmazonECR/latest/userguide/repository-create.html)和[推送映像](https://docs.aws.amazon.com/AmazonECR/latest/userguide/docker-push-ecr-image.html)。
+ 在与映像存储库相同的区域中创建的 Amazon ECS 集群和服务。有关更多信息，请参阅 *Amazon Elastic Container Service 开发者指南* 中的[创建集群](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/create_cluster.html)和[创建服务](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/create-service.html)。

在满足这些先决条件后，您可以继续完成本教程并创建您的 CD 管道。

## 步骤 1：向源存储库添加 Dockerfile
<a name="tutorials-ecr-build-publish-file"></a>

本教程使用该 ECRBuildAndPublish 操作来构建 Docker 镜像并将镜像推送到 Amazon ECR。中的托管计算操作 CodePipeline CodeBuild 用于运行 ECR 登录和映像推送的命令。您无需向源代码存储库中添加`buildspec.yml`文件即可说明 CodeBuild如何执行此操作。在本示例中，您只需在存储库中提供 Dockerfile，如下所示。

粘贴此示例文本以创建您的 `Dockerfile` 文件。此示例 Dockerfile 与先决条件中 ECR 镜像说明中使用的示例相同。

```
FROM public.ecr.aws/amazonlinux/amazonlinux:latest

# Install dependencies
RUN yum update -y && \
 yum install -y httpd

# Install apache and write hello world message
RUN echo 'Hello World!' > /var/www/html/index.html

# Configure apache
RUN echo 'mkdir -p /var/run/httpd' >> /root/run_apache.sh && \
 echo 'mkdir -p /var/lock/httpd' >> /root/run_apache.sh && \
 echo '/usr/sbin/httpd -D FOREGROUND' >> /root/run_apache.sh && \
 chmod 755 /root/run_apache.sh

EXPOSE 80

CMD /root/run_apache.sh
```

**将 `Dockerfile` 文件添加至您的源存储库**

1. 打开文本编辑器，然后将上述 Dockerfile 复制并粘贴到新文件中。

1. 提交您的 `Dockerfile` 文件并将其推送至源存储库。

   1. 添加文件。

      ```
      git add .
      ```

   1. 提交更改。

      ```
      git commit -m "Adding Dockerfile."
      ```

   1. 推送提交。

      ```
      git push
      ```

   确保文件位于存储库的根级别。

   ```
   / Dockerfile
   ```

## 步骤 2：向源存储库添加 imagedefinitions.json 文件
<a name="w2aac13b9c15"></a>

本教程使用中的 Amazon ECS 标准部署操作将您的容器部署 CodePipeline 到您的 Amazon ECS 集群。Amazon ECS 标准部署操作需要一个包含您的映像名称和 URI 的 imagedefinitions.json 文件。有关 imagedefinitions.json 文件的更多信息，请参阅[适用于 Amazon ECS 标准部署操作的 imagedefinitions.json 文件](file-reference.md#pipelines-create-image-definitions)。

粘贴此示例文本以创建您的 `imagedefinitions.json` 文件。使用 Dockerfile 中的名称，例如 `hello-world`，并使用存储映像的 Amazon ECR 存储库中的 URI。

```
[
  {
    "name": "hello-world",
    "imageUri": "ACCOUNT-ID.dkr.ecr.us-east-1.amazonaws.com/actions/image-repo"
  }
]
```

**将 `imagedefinitions.json` 文件添加至您的源存储库**

1. 打开文本编辑器，然后将上述示例复制并粘贴到新文件中。

1. 提交您的 `imagedefinitions.json` 文件并将其推送至源存储库。

   1. 添加文件。

      ```
      git add .
      ```

   1. 提交更改。

      ```
      git commit -m "Adding imagedefinitions.json."
      ```

   1. 推送提交。

      ```
      git push
      ```

   确保文件位于存储库的根级别。

   ```
   / imagedefinitions.json
   ```

## 步骤 3：创建管道
<a name="tutorials-ecr-build-publish-pipeline"></a>

使用向 CodePipeline 导创建工作流阶段并连接源存储库。

**创建管道**

1. 打开 CodePipeline 控制台，网址为[https://console.aws.amazon.com/codepipeline/](https://console.aws.amazon.com/codepipeline/)。

1. 在**欢迎**页面、**入门**页面或**管道**页面上，选择**创建管道**。

1. 在**步骤 1：选择创建选项**页面上的**创建选项**下，选择**构建自定义管道**选项。选择**下一步**。

1. 在**步骤 2：选择管道设置**的**管道名称**中，输入 **MyPipeline**。

1. CodePipeline 提供 V1 和 V2 类型的管道，它们的特性和价格各不相同。在控制台中，您只能选择 V2 类型。有关更多信息，请参阅[管道类型](https://docs.aws.amazon.com/codepipeline/latest/userguide/pipeline-types-planning.html?icmpid=docs_acp_help_panel)。有关定价的信息 CodePipeline，请参阅[定价](https://aws.amazon.com/codepipeline/pricing/)。

1. 在**服务角色**中，选择**新建服务角色** CodePipeline 以允许在 IAM 中创建服务角色。

1. 将**高级设置**中的各项设置保留为默认值，然后选择**下一步**。

1. 在**步骤 3：添加源阶段**页面上，添加源阶段：

   1. 在**来源提供商**中，选择 **GitHub （通过 GitHub 应用程序）**。

   1. 在**连接**下，选择一个现有连接或创建一个新连接。要创建或管理 GitHub源操作的连接，请参阅[GitHub 连接](connections-github.md)。

   1. 在 **Repository name (存储库名称)** 中，选择 GitHub 存储库的名称。

   1. 在**默认分支**中，选择在管道手动启动或使用非 Git 标签的源事件时要指定的分支。如果更改的来源不是触发器，或者管道执行是手动启动的，则使用的更改将是来自默认分支的 HEAD 提交。

   选择**下一步**。

1. 在 “**步骤 4：添加构建阶段**” 页面上，选择 “**其他构建提供者**选择” **ECRBuildAndPublish**。  
![\[\]](http://docs.aws.amazon.com/zh_cn/codepipeline/latest/userguide/images/ecrbuild-wizard.png)

   1. 在 **ECR 存储库名称**中，选择您的映像存储库。

   1. 选择**下一步**。

1. 在**步骤 5：添加测试阶段**中，选择**跳过测试阶段**，并通过再次选择**跳过**接受警告消息。

   选择**下一步**。

1. 在**步骤 6：添加部署阶段**页面上，选择**跳过部署阶段**。您将在以下步骤中添加 ECS 操作。

1. 在 “**步骤 7：审阅**” 页面上，查看您的工作流配置，然后选择**创建管道**来创建管道。

1. 编辑您的管道以将 Amazon ECS 部署操作添加到您的管道中：

   1. 在右上角，选择**编辑**。

   1. 在示意图底部，选择 **\$1 添加阶段**。在**阶段名称**中，输入名称，例如 **Deploy**。

   1. 选择 **\$1 添加操作组**。

   1. 在**操作名称**中输入名称。

   1. 在**操作提供程序**中，选择 Amazon ECS。允许**区域**默认为管道区域。

   1. 在**输入构件**中，从源阶段选择输入构件，例如 `SourceArtifact`。

   1. 对于**集群名称**，请选择在其中运行您的服务的 Amazon ECS 集群。

   1. 对于**服务名称**，选择要更新的服务。

   1. 选择**保存**。

   1. 在所编辑的阶段上，选择**完成**。在 AWS CodePipeline 窗格中，选择**保存**，然后选择警告消息上的**保存**。

   1. 要提交所做的更改并开始管道构建，请选择**发布更改**，然后选择**发布**。

1. 管道运行后，查看管道结构和状态。  
![\[\]](http://docs.aws.amazon.com/zh_cn/codepipeline/latest/userguide/images/ecrbuild-ecsaction.png)

1. 管道成功运行后，选择**查看详细信息**即可查看操作日志，查看托管计算操作输出。  
![\[\]](http://docs.aws.amazon.com/zh_cn/codepipeline/latest/userguide/images/ecrbuild-logs.png)

1. 对任何失败的操作进行故障排除。例如，如果 imagedefinitions.json 文件不在源存储库中，ECS 部署操作可能会失败。下面是 imagedefinitions.json 文件丢失时显示的错误消息的示例。  
![\[\]](http://docs.aws.amazon.com/zh_cn/codepipeline/latest/userguide/images/ecrbuild-ecsdebug.png)

## 步骤 4：测试您的管道
<a name="tutorials-ecr-build-publish-test"></a>

您的管道应该具备运行 end-to-end原生 AWS 持续部署所需的一切。现在，通过将代码更改推送至您的源存储库来测试管道的功能。

**测试您的管道**

1. 对您的已配置源存储库进行代码更改，然后提交并推送更改。

1. 打开 CodePipeline 控制台，网址为[https://console.aws.amazon.com/codepipeline/](https://console.aws.amazon.com/codepipeline/)。

1. 从列表中选择您的管道。

1. 监视管道经历不同阶段的进度。您的管道应完成且您的操作会将通过您的代码更改创建的 Docker 映像推送到 ECR。