

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 教學課程：使用 CodePipeline (V2 類型） 建置 Docker 映像並將其推送至 Amazon ECR
<a name="tutorials-ecr-build-publish"></a>

本教學課程可協助您在 CodePipeline 中建立建置動作，在原始程式碼變更後執行 Docker 映像並將其推送至 Amazon ECR。本教學課程也說明如何新增部署推送映像的 Amazon ECS 部署動作。

**重要**  
在主控台中建立管道時，CodePipeline 將使用 S3 成品儲存貯體做為成品。（這與用於 S3 來源動作的 儲存貯體不同。) 如果 S3 成品儲存貯體位於與管道帳戶不同的帳戶中，請確定 S3 成品儲存貯體由 所擁有 AWS 帳戶 ，安全且可靠。

**注意**  
本教學課程適用於具有 GitHub 來源儲存庫的 CodePipeline 管道的 ECRBuildAndPublish 建置動作，以及用於部署至 Amazon ECS 叢集的 Amazon ECS 標準動作。如需使用管道搭配 ECR 映像儲存庫做為 CodePipeline 中 Amazon ECS 至 CodeDeploy 藍/綠部署動作來源的教學課程，請參閱 [教學課程：使用 Amazon ECR 來源和 ECS-to-CodeDeploy 部署建立管道](tutorials-ecs-ecr-codedeploy.md)。

**重要**  
此動作使用 CodePipeline 受管 CodeBuild 運算在建置環境中執行命令。執行命令動作會產生個別費用 AWS CodeBuild。

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

您必須先有幾個資源，才能使用此教學來建立 CD 管道。以下是在開始使用前需準備的事項：

**注意**  
所有這些資源都應在相同區域內建立 AWS 。
+ 來源控制儲存庫 （本教學課程使用 GitHub)，您將在此教學課程中新增下列項目：
  + 在步驟 1 中，您將新增範例 Dockerfile 到您的來源儲存庫，做為 CodePipeline 中 ECRBuildAndPublish 建置動作的輸入成品。
  + 在步驟 2 中，您將新增範例 imagedefinitions.json 檔案到來源儲存庫，作為 CodePipeline 中 Amazon ECS 標準部署動作的需求。
+ 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>

本教學課程使用 CodePipeline theAmazon ECS 標準部署動作，將您的容器部署到 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. 前往 [https://console.aws.amazon.com/codepipeline/](https://console.aws.amazon.com/codepipeline/) 開啟 CodePipeline 主控台。

1. 在 **Welcome (歡迎)** 頁面、**Getting started (入門)** 頁面、或者 **Pipelines (管道)** 頁面上，選擇 **Create pipeline (建立管道)**。

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. 將 **Advanced settings (進階設定)** 下的設定保留為預設值，然後選擇 **Next (下一步)**。

1. 在**步驟 3：新增來源階段**頁面上，新增來源階段：

   1. 在**來源提供者**中，選擇 **GitHub （透過 GitHub 應用程式）**。

   1. 在**連線**下，選擇現有的連線或建立新的連線。若要建立或管理 GitHub 來源動作的連線，請參閱 [GitHub 連線](connections-github.md)。

   1. 在**儲存庫名稱**中，選擇 GitHub 儲存庫的名稱。

   1. 在**預設分支**中，選擇您希望在管道手動啟動時或來源事件不是 Git 標籤時指定的分支。如果變更的來源不是觸發條件，或者是手動啟動管道執行，則所使用的變更將是來自預設分支的 HEAD 遞交。

   選擇**下一步**。

1. 在**步驟 4：新增建置階段**頁面上，選擇**其他建置提供者**選擇 **ECRBuildAndPublish**。  
![\[\]](http://docs.aws.amazon.com/zh_tw/codepipeline/latest/userguide/images/ecrbuild-wizard.png)

   1. 針對 **ECR 儲存庫名稱**，選擇您的映像儲存庫。

   1. 選擇**下一步**。

1. 在**步驟 5：新增測試階段**中，選擇**略過測試階段**，然後再次選擇**略過**以接受警告訊息。

   選擇**下一步**。

1. 在**步驟 6：新增部署階段**頁面上，選擇**略過部署階段**。您將在下列步驟中新增 ECS 動作。

1. 在**步驟 7：檢閱**頁面上，檢閱管道組態，然後選擇**建立管道**以建立管道。

1. 編輯管道，將 Amazon ECS 部署動作新增至管道：

   1. 在右上角，選擇 **Edit (編輯)**。

   1. 在圖表的底部，選擇 **\$1 Add stage (\$1 新增階段)**。在 **Stage name (階段名稱)** 中，輸入名稱，例如 **Deploy**。

   1. 選擇 **\$1 Add action group (\$1 新增動作群組)**。

   1. 在 **​Action name (動作名稱)** 中，輸入名稱。

   1. 在**動作提供者**中，選擇 Amazon ECS。允許 **Region (區域)** 預設為管道區域。

   1. 在**輸入成品**中，從來源階段選擇輸入成品，例如 `SourceArtifact`。

   1. 針對**叢集名稱**，選擇服務執行所在的 Amazon ECS 叢集。

   1. 針對**服務名稱**，選擇要更新的服務。

   1. 選擇**儲存**。

   1. 在您編輯的階段上，選擇 **Done (完成)**。在 AWS CodePipeline 窗格中，選擇 **Save (儲存)**，然後在警告訊息中選擇 **Save (儲存)**。

   1. 若要提交您的變更並啟動管道建置，請選擇 **​Release change (發行變更)**，然後選擇 **​Release (發行)**。

1. 管道執行後，檢視管道結構和狀態。  
![\[\]](http://docs.aws.amazon.com/zh_tw/codepipeline/latest/userguide/images/ecrbuild-ecsaction.png)

1. 管道成功執行後，請選擇**檢視詳細資訊**以檢視動作上的日誌，以檢視受管運算動作輸出。  
![\[\]](http://docs.aws.amazon.com/zh_tw/codepipeline/latest/userguide/images/ecrbuild-logs.png)

1. 故障診斷任何失敗的動作。例如，如果 imagedefinitions.json 檔案不在來源儲存庫中，則 ECS 部署動作可能會失敗。以下是當 imagedefinitions.json 檔案遺失時顯示的錯誤訊息範例。  
![\[\]](http://docs.aws.amazon.com/zh_tw/codepipeline/latest/userguide/images/ecrbuild-ecsdebug.png)

## 步驟 4：測試管道
<a name="tutorials-ecr-build-publish-test"></a>

您的管道應具備執行end-to-end原生 AWS 持續部署所需的一切。現在，將程式碼變更推送至來源儲存庫，以測試其功能。

**測試管道**

1. 對設定的來源儲存庫進行程式碼變更、遞交並推送變更。

1. 前往 [https://console.aws.amazon.com/codepipeline/](https://console.aws.amazon.com/codepipeline/) 開啟 CodePipeline 主控台。

1. 從清單中選擇管道。

1. 觀看管道階段的管道進度。您的管道應該完成，而且您的動作會將 Docker 映像推送至從程式碼變更建立的 ECR。