

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# CodeBuild の 'Docker イメージを Amazon ECR イメージリポジトリに公開' サンプル
<a name="sample-docker"></a>

このサンプルでは、Docker イメージをビルド出力として生成し、Docker イメージを Amazon Elastic Container Registry (Amazon ECR) イメージリポジトリにプッシュします。このサンプルを適応させて、Docker イメージを Docker Hub にプッシュすることができます。詳細については、「['Docker イメージを Amazon ECR に公開' サンプルを Docker Hub にプッシュするように変更](sample-docker-docker-hub.md)」を参照してください。

カスタム Docker ビルドイメージ (Docker Hub の `docker:dind`) を使用して Docker イメージをビルドする方法については、「[カスタム Docker イメージのサンプル](sample-docker-custom-image.md)」を参照してください。

このサンプルは、`golang:1.12` を参照してテストされています。

このサンプルでは、新しいマルチステージの Docker ビルド機能を使用しています。この機能により、Docker イメージがビルド出力として生成されます。次に、Docker イメージがAmazon ECR イメージリポジトリにプッシュされます。マルチステージの Docker イメージビルドは、最終的な Docker イメージのサイズを縮小するのに役立ちます。詳細については、「[Docker でのマルチステージビルドの使用](https://docs.docker.com/engine/userguide/eng-image/multistage-build/)」を参照してください。

**重要**  
このサンプルを実行すると、 AWS アカウントに料金が発生する可能性があります。これには、Amazon S3、、CloudWatch Logs AWS KMS、Amazon ECR に関連する AWS リソースとアクション AWS CodeBuild に対して発生する可能性のある料金が含まれます。詳細については、[CodeBuild 料金表](https://aws.amazon.com/codebuild/pricing)、[Amazon S3 料金表](https://aws.amazon.com/s3/pricing)、[AWS Key Management Service 料金表](https://aws.amazon.com/kms/pricing)、[Amazon CloudWatch 料金表](https://aws.amazon.com/cloudwatch/pricing)、[Amazon Elastic Container Registry 料金表](https://aws.amazon.com/ecr/pricing)を参照してください。

**Topics**
+ ['Docker イメージを Amazon ECR に公開' サンプルを実行](#sample-docker-running)
+ ['Docker イメージを Amazon ECR に公開' サンプルを Docker Hub にプッシュするように変更](sample-docker-docker-hub.md)

## 'Docker イメージを Amazon ECR に公開' サンプルを実行
<a name="sample-docker-running"></a>

Docker イメージを Amazon ECR に公開するサンプルを実行するには、次の手順に従います。このサンプルの詳細については、「[CodeBuild の 'Docker イメージを Amazon ECR イメージリポジトリに公開' サンプル](#sample-docker)」を参照してください。

**このサンプルを実行するには**

1. 使用する Amazon ECR にイメージリポジトリがすでにある場合は、ステップ 3 に進みます。それ以外の場合は、 AWS ルートアカウントまたは管理者ユーザーの代わりに ユーザーを使用して Amazon ECR を操作する場合は、このステートメント (*\$1\$1\$1 BEGIN ADDING STATEMENT HERE \$1\$1\$1* と *\$1\$1\$1 END ADDING STATEMENT HERE \$1\$1\$1 の間*) をユーザー (またはユーザーが関連付けられている IAM グループ) に追加します。 AWS ルートアカウントの使用はお勧めしません。このステートメントでは、Docker イメージを保存するための Amazon ECR リポジトリを作成できます。省略記号 (`...`) は、簡潔にするために使用され、ステートメントを追加する場所の特定に役立ちます。ステートメントを削除しないでください、また、これらの省略記号をポリシーに入力しないでください。詳細については、*ユーザーガイド*の「[AWS マネジメントコンソールでのインラインポリシーの使用](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_inline-using.html#AddingPermissions_Console)」を参照してください。

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": [
                   "ecr:CreateRepository"
               ],
               "Resource": "*"
           }
       ]
   }
   ```

------
**注記**  
このポリシーを変更する IAM エンティティは、ポリシーを変更するために IAM のアクセス許可を持っている必要があります。

1. Amazon ECR にイメージリポジトリを作成します。必ず、ビルド環境を作成してビルドを実行するリージョンと同じ AWS リージョンにリポジトリを作成します。詳細については、*Amazon ECR ユーザーガイド*の「[リポジトリの作成](https://docs.aws.amazon.com/AmazonECR/latest/userguide/repository-create.html)」を参照してください。このリポジトリの名前は、この手順で後ほど `IMAGE_REPO_NAME` 環境変数を使用して指定するリポジトリ名と一致させる必要があります。Amazon ECR リポジトリポリシーで、CodeBuild サービスの IAM ロールに、イメージをプッシュするアクセスが許可されていることを確認してください。

1. このステートメント (*\$1\$1\$1 BEGIN ADDING STATEMENT HERE \$1\$1\$1* と *\$1\$1\$1 END ADDING STATEMENT HERE \$1\$1\$1* の間) を AWS CodeBuild サービスロールにアタッチしたポリシーに追加します。このステートメントでは、Amazon ECR リポジトリに Docker イメージをアップロードすることを CodeBuild に許可します。省略記号 (`...`) は、簡潔にするために使用され、ステートメントを追加する場所の特定に役立ちます。ステートメントを削除しないでください、また、これらの省略記号をポリシーに入力しないでください。

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": [
                   "ecr:BatchCheckLayerAvailability",
                   "ecr:CompleteLayerUpload",
                   "ecr:GetAuthorizationToken",
                   "ecr:InitiateLayerUpload",
                   "ecr:PutImage",
                   "ecr:UploadLayerPart"
               ],
               "Resource": "*"
           }
       ]
   }
   ```

------
**注記**  
このポリシーを変更する IAM エンティティは、ポリシーを変更するために IAM のアクセス許可を持っている必要があります。

1. このトピックの [ディレクトリ構造](#sample-docker-dir)および [ファイル](#sample-docker-files)セクションで説明されているようにファイルを作成し、S3 入力バケットまたは AWS CodeCommit、GitHub、または Bitbucket リポジトリにアップロードします。詳細については、「*AWS CodePipeline ユーザーガイド*」の「[イメージ定義ファイルのリファレンス](https://docs.aws.amazon.com/codepipeline/latest/userguide/file-reference.html)」を参照してください。
**重要**  
`(root directory name)` をアップロードしないでください。アップロードするのは、`(root directory name)` 内のファイルのみです。  
S3 入力バケットを使用している場合は、ファイルを必ず ZIP ファイルに圧縮してから入力バケットにアップロードしてください。`(root directory name)` を ZIP ファイルに追加しないでください。追加するのは、`(root directory name)` 内のファイルのみです。

1. ビルドプロジェクトを作成して、ビルドを実行し、ビルド情報を表示します。

    コンソールを使用してプロジェクトを作成する場合:

   1.  [**Operating system**] で、[**Ubuntu**] を選択します。

   1.  [**ランタイム**] で、[**Standard (標準)**] を選択します。

   1.  [**イメージ**] で、[**aws/codebuild/standard:5.0**] を選択します。

   1.  次の環境変数を設定します。
      +  AWS\$1DEFAULT\$1REGION (値は *region-ID*) 
      +  AWS\$1ACCOUNT\$1ID (値は *account-ID*) 
      +  IMAGE\$1TAG (最新の値) 
      +  IMAGE\$1REPO\$1NAME (値は *Amazon-ECR-repo-name*) 

   を使用してビルドプロジェクト AWS CLI を作成する場合、`create-project`コマンドへの JSON 形式の入力は次のようになります。(プレースホルダは独自の値に置き換えてください。)

   ```
   {
     "name": "sample-docker-project",
     "source": {
       "type": "S3",
       "location": "codebuild-region-ID-account-ID-input-bucket/DockerSample.zip"
     },
     "artifacts": {
       "type": "NO_ARTIFACTS"
     },
     "environment": {
       "type": "LINUX_CONTAINER",
       "image": "aws/codebuild/standard:5.0",
       "computeType": "BUILD_GENERAL1_SMALL",
       "environmentVariables": [
         {
           "name": "AWS_DEFAULT_REGION",
           "value": "region-ID"
         },
         {
           "name": "AWS_ACCOUNT_ID",
           "value": "account-ID"
         },
         {
           "name": "IMAGE_REPO_NAME",
           "value": "Amazon-ECR-repo-name"
         },
         {
           "name": "IMAGE_TAG",
           "value": "latest"
         }
       ],
     },
     "serviceRole": "arn:aws:iam::account-ID:role/role-name",
     "encryptionKey": "arn:aws:kms:region-ID:account-ID:key/key-ID"
   }
   ```

1. CodeBuild が Docker イメージをリポジトリに正常にプッシュしたことを確認します。

   1. Amazon ECR コンソール ([https://console.aws.amazon.com/ecr/](https://console.aws.amazon.com/ecr/)) を開きます。

   1. リポジトリ名を選択します。イメージは、[**Image tag (イメージタグ)**] 列に表示されています。

### ディレクトリ構造
<a name="sample-docker-dir"></a>

このサンプルのディレクトリ構造は次のとおりとします。

```
(root directory name)
├── buildspec.yml
└── Dockerfile
```

### ファイル
<a name="sample-docker-files"></a>

このサンプルで使用するファイルは以下のとおりです。

`buildspec.yml` ( 内)`(root directory name)`

```
version: 0.2

phases:
  pre_build:
    commands:
      - echo Logging in to Amazon ECR...
      - aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com
  build:
    commands:
      - echo Build started on `date`
      - echo Building the Docker image...          
      - docker build -t $IMAGE_REPO_NAME:$IMAGE_TAG .
      - docker tag $IMAGE_REPO_NAME:$IMAGE_TAG $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG      
  post_build:
    commands:
      - echo Build completed on `date`
      - echo Pushing the Docker image...
      - docker push $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG
```

`Dockerfile` ( 内)`(root directory name)`

```
FROM golang:1.12-alpine AS build
#Install git
RUN apk add --no-cache git
#Get the hello world package from a GitHub repository
RUN go get github.com/golang/example/hello
WORKDIR /go/src/github.com/golang/example/hello
# Build the project and send the output to /bin/HelloWorld 
RUN go build -o /bin/HelloWorld

FROM golang:1.12-alpine
#Copy the build's output binary from the previous build container
COPY --from=build /bin/HelloWorld /bin/HelloWorld
ENTRYPOINT ["/bin/HelloWorld"]
```

**注記**  
CodeBuild はカスタムDocker イメージの「`ENTRYPOINT`」をオーバーライドします。

# 'Docker イメージを Amazon ECR に公開' サンプルを Docker Hub にプッシュするように変更
<a name="sample-docker-docker-hub"></a>

'Docker イメージを Amazon ECR に公開' サンプルを調整して、Docker イメージが Amazon ECR の代わりに Docker Hub にプッシュされるようにするには、サンプルのコードを編集します。サンプルの詳細については、「[CodeBuild の 'Docker イメージを Amazon ECR イメージリポジトリに公開' サンプル](sample-docker.md)」と「['Docker イメージを Amazon ECR に公開' サンプルを実行](sample-docker.md#sample-docker-running)」を参照してください。
**注記**  
使用している Docker のバージョンが 17.06 より前のものである場合は、`--no-include-email` オプションを削除します。

1. `buildspec.yml` ファイルで、以下の Amazon ECR 固有のコード行を置き換えます。

   ```
   ...
     pre_build:
       commands:
         - echo Logging in to Amazon ECR...
         - aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com
     build:
       commands:
         - echo Build started on `date`
         - echo Building the Docker image...          
         - docker build -t $IMAGE_REPO_NAME:$IMAGE_TAG .
         - docker tag $IMAGE_REPO_NAME:$IMAGE_TAG $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG
     post_build:
       commands:
         - echo Build completed on `date`
         - echo Pushing the Docker image...
         - docker push $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG
   ...
   ```

   代わりに、以下の Docker Hub 固有のコード行を使用します。

   ```
   ...
     pre_build:
       commands:
         - echo Logging in to Docker Hub...
         # Type the command to log in to your Docker Hub account here.          
     build:
       commands:
         - echo Build started on `date`
         - echo Building the Docker image...
         - docker build -t $IMAGE_REPO_NAME:$IMAGE_TAG .
         - docker tag $IMAGE_REPO_NAME:$IMAGE_TAG $IMAGE_REPO_NAME:$IMAGE_TAG
     post_build:
       commands:
         - echo Build completed on `date`
         - echo Pushing the Docker image...
         - docker push $IMAGE_REPO_NAME:$IMAGE_TAG
   ...
   ```

1. 編集したコードを S3 入力バケット、、GitHub AWS CodeCommit、または Bitbucket リポジトリにアップロードします。
**重要**  
`(root directory name)` をアップロードしないでください。アップロードするのは、`(root directory name)` 内のファイルのみです。  
S3 入力バケットを使用している場合は、ファイルを必ず ZIP ファイルに圧縮してから入力バケットにアップロードしてください。`(root directory name)` を ZIP ファイルに追加しないでください。追加するのは、`(root directory name)` 内のファイルのみです。

1. `create-project` コマンドに対する JSON 形式の入力で、以下のコード行が置き換えの対象です。

   ```
   ...
       "environmentVariables": [
         {
           "name": "AWS_DEFAULT_REGION",
           "value": "region-ID"
         },
         {
           "name": "AWS_ACCOUNT_ID",
           "value": "account-ID"
         },
         {
           "name": "IMAGE_REPO_NAME",
           "value": "Amazon-ECR-repo-name"
         },
         {
           "name": "IMAGE_TAG",
           "value": "latest"
         }
       ]
   ...
   ```

   以下のコード行に置き換えます。

   ```
   ...
       "environmentVariables": [
         {
           "name": "IMAGE_REPO_NAME",
           "value": "your-Docker-Hub-repo-name"
         },
         {
           "name": "IMAGE_TAG",
           "value": "latest"
         }
       ]
   ...
   ```

1. ビルド環境を作成して、ビルドを実行し、関連するビルド情報を表示します。

1. が Docker イメージをリポジトリに AWS CodeBuild 正常にプッシュしたことを確認します。Docker Hub にサインインし、リポジトリに進み、[**Tags**] タブを選択します。`latest` タグには、ごく最近の **[Last Updated]** (最終更新) の値が含まれています。