このサンプルでは、Docker イメージをビルド出力として生成し、Docker イメージを Amazon Elastic Container Registry (Amazon ECR) イメージリポジトリにプッシュします。このサンプルを適応させて、Docker イメージを Docker Hub にプッシュすることができます。詳細については、「'Docker イメージを Amazon ECR に公開' サンプルを Docker Hub にプッシュするように変更」を参照してください。
カスタム Docker ビルドイメージ (Docker Hub の docker:dind
) を使用して Docker イメージをビルドする方法については、「カスタム Docker イメージのサンプル」を参照してください。
このサンプルは、golang:1.12
を参照してテストされています。
このサンプルでは、新しいマルチステージの Docker ビルド機能を使用しています。この機能により、Docker イメージがビルド出力として生成されます。次に、Docker イメージがAmazon ECR イメージリポジトリにプッシュされます。マルチステージの Docker イメージビルドは、最終的な Docker イメージのサイズを縮小するのに役立ちます。詳細については、「Docker でのマルチステージビルドの使用
重要
このサンプルを実行すると、AWS アカウントに課金される場合があります。これには、AWS CodeBuild と、Amazon S3、AWS KMS、CloudWatch Logs、Amazon ECR に関連する AWS リソースおよびアクションに対する料金が含まれます。詳細については、CodeBuild 料金表
トピック
'Docker イメージを Amazon ECR に公開' サンプルを実行
Docker イメージを Amazon ECR に公開するサンプルを実行するには、次の手順に従います。このサンプルの詳細については、「CodeBuild の 'Docker イメージを Amazon ECR イメージリポジトリに公開' サンプル」を参照してください。
このサンプルを実行するには
-
使用する Amazon ECR にイメージリポジトリがすでにある場合は、ステップ 3 に進みます。それ以外の場合、AWS ルートアカウントまたは管理者ユーザーの代わりにユーザーを使用して Amazon ECR を操作するには、ユーザー (またはユーザーが関連付けられている IAM グループ) に次のステートメントを (
### BEGIN ADDING STATEMENT HERE ###
と### END ADDING STATEMENT HERE ###
の間に) 追加します。AWS ルートアカウントは使用しないでください。このステートメントでは、Docker イメージを保存する Amazon ECR リポジトリの作成を許可します。省略記号 (...
) は、簡潔にするために使用され、ステートメントを追加する場所の特定に役立ちます。ステートメントを削除しないでください、また、これらの省略記号をポリシーに入力しないでください。詳細については、ユーザーガイドの「AWS Management Console でのインラインポリシーの使用」を参照してください。{ "Statement": [
### BEGIN ADDING STATEMENT HERE ###
{ "Action": [ "ecr:CreateRepository" ], "Resource": "*", "Effect": "Allow" },### END ADDING STATEMENT HERE ###
... ], "Version": "2012-10-17" }注記
このポリシーを変更する IAM エンティティは、ポリシーを変更するために IAM のアクセス許可を持っている必要があります。
-
Amazon ECR にイメージリポジトリを作成します。リポジトリの作成先の AWS リージョンは、ビルド環境を作成してビルドを実行するリージョンと同じにする必要があります。詳細については、Amazon ECR ユーザーガイドの「リポジトリの作成」を参照してください。このリポジトリの名前は、この手順で後ほど
IMAGE_REPO_NAME
環境変数を使用して指定するリポジトリ名と一致させる必要があります。Amazon ECR リポジトリポリシーで、CodeBuild サービスの IAM ロールに、イメージをプッシュするアクセスが許可されていることを確認してください。 -
このステートメント (
###BEGIN ADDING STATEMENT HERE###
と###END ADDING STATEMENT HERE###
の間) を AWS CodeBuild サービスロールにアタッチしたポリシーに追加します。このステートメントでは、Amazon ECR リポジトリに Docker イメージをアップロードすることを CodeBuild に許可します。省略記号 (...
) は、簡潔にするために使用され、ステートメントを追加する場所の特定に役立ちます。ステートメントを削除しないでください、また、これらの省略記号をポリシーに入力しないでください。{ "Statement": [
### BEGIN ADDING STATEMENT HERE ###
{ "Action": [ "ecr:BatchCheckLayerAvailability", "ecr:CompleteLayerUpload", "ecr:GetAuthorizationToken", "ecr:InitiateLayerUpload", "ecr:PutImage", "ecr:UploadLayerPart" ], "Resource": "*", "Effect": "Allow" },### END ADDING STATEMENT HERE ###
... ], "Version": "2012-10-17" }注記
このポリシーを変更する IAM エンティティは、ポリシーを変更するために IAM のアクセス許可を持っている必要があります。
-
このトピックの「ディレクトリ構造」セクションと「ファイル」セクションで説明しているファイルを作成し、これらのファイルを S3 入力バケットにアップロードするか、AWS CodeCommit、GitHub、Bitbucket のいずれかのリポジトリにアップロードします。詳細については、「AWS CodePipeline ユーザーガイド」の「イメージ定義ファイルのリファレンス」を参照してください。
重要
をアップロードしないでください。アップロードするのは、(root directory name)
内のファイルのみです。(root directory name)
S3 入力バケットを使用している場合は、ファイルを必ず ZIP ファイルに圧縮してから入力バケットにアップロードしてください。
を ZIP ファイルに追加しないでください。追加するのは、(root directory name)
内のファイルのみです。(root directory name)
-
ビルドプロジェクトを作成して、ビルドを実行し、ビルド情報を表示します。
コンソールを使用してプロジェクトを作成する場合:
-
[Operating system] で、[Ubuntu] を選択します。
-
[ランタイム] で、[Standard (標準)] を選択します。
-
[イメージ] で、[aws/codebuild/standard:5.0] を選択します。
-
次の環境変数を設定します。
-
AWS_DEFAULT_REGION (値は
region-ID
) -
AWS_ACCOUNT_ID (値は
account-ID
) -
IMAGE_TAG (最新の値)
-
IMAGE_REPO_NAME (値は
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
" } -
-
CodeBuild が Docker イメージをリポジトリに正常にプッシュしたことを確認します。
-
Amazon ECR コンソール (https://console.aws.amazon.com/ecr/
) を開きます。 -
リポジトリ名を選択します。イメージは、[Image tag (イメージタグ)] 列に表示されています。
-
ディレクトリ構造
このサンプルのディレクトリ構造は次のとおりとします。
(root directory name)
├── buildspec.yml
└── Dockerfile
ファイル
このサンプルで使用するファイルは以下のとおりです。
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
」をオーバーライドします。