![見出し画像](https://assets.st-note.com/production/uploads/images/161640725/rectangle_large_type_2_a1c34f408086be14a42756e32502c05d.jpeg?width=1200)
CodePipelineを使ったECRの作成とデプロイ(2)
Dockerfileを作る
今のbuidspec.ymlをみてみよう
version: 0.2
phases:
pre_build:
commands:
- AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
- "echo AWS account ID: $AWS_ACCOUNT_ID"
# ECRにログイン
- aws ecr get-login-password --region $AWS_REGION | docker login --username AWS --password-stdin $AWS_ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com
- REPOSITORY_URI="$AWS_ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com/demos/ecr-demo"
build:
commands:
# AmazonのパブリックECRからAlpineイメージを使用
- |
cat << 'EOF' > Dockerfile
FROM public.ecr.aws/docker/library/alpine:latest
CMD echo 'Hello from Amazon ECR Alpine Docker!'
EOF
# 作成したDockerfileの内容を表示
- cat Dockerfile
# Dockerビルドの実行
- docker build -t ecr-demo .
# ビルドしたDockerイメージを確認
- docker images
# テストとしてDockerイメージの実行
- docker run ecr-demo
# タグを付けてプッシュ準備
- docker tag ecr-demo:latest $REPOSITORY_URI:latest
post_build:
commands:
# イメージのプッシュ
- docker push $REPOSITORY_URI:latest
ここで
# AmazonのパブリックECRからAlpineイメージを使用
- |
cat << 'EOF' > Dockerfile
FROM public.ecr.aws/docker/library/alpine:latest
CMD echo 'Hello from Amazon ECR Alpine Docker!'
EOF
# 作成したDockerfileの内容を表示
- cat Dockerfile
この箇所で無理無理Dockerfileを作っていたりするので、これを分離する。これは前回CodeBuild 単発のノーソース状態で行っていたときの名残りだ。
Dockerfile
FROM public.ecr.aws/docker/library/alpine:latest
CMD echo 'Hello from Amazon ECR Alpine Docker!'
なぜ public.ecr.aws を使っているかというのはこの辺に由来
commit hashをタグとして使う
先程のDockerfileの生成を削除したbuildspec.ymlがこちら
version: 0.2
phases:
pre_build:
commands:
- AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
- "echo AWS account ID: $AWS_ACCOUNT_ID"
# ECRにログイン
- aws ecr get-login-password --region $AWS_REGION | docker login --username AWS --password-stdin $AWS_ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com
- REPOSITORY_URI="$AWS_ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com/demos/ecr-demo"
build:
commands:
# Dockerビルドの実行
- docker build -t ecr-demo .
# ビルドしたDockerイメージを確認
- docker images
# テストとしてDockerイメージの実行
- docker run ecr-demo
# タグを付けてプッシュ準備
- docker tag ecr-demo:latest $REPOSITORY_URI:latest
post_build:
commands:
# イメージのプッシュ
- docker push $REPOSITORY_URI:latest
ここで
- docker tag test-docker-image:latest $REPOSITORY_URI:latest
このlatest固定なのをせっかくgitを経由しているのでcommit hashに変更してみよう。以下のようにする
version: 0.2
phases:
pre_build:
commands:
- COMMIT_HASH=$(echo $CODEBUILD_RESOLVED_SOURCE_VERSION | cut -c 1-7)
- AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
- "echo AWS account ID: $AWS_ACCOUNT_ID"
# ECRにログイン
- aws ecr get-login-password --region $AWS_REGION | docker login --username AWS --password-stdin $AWS_ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com
- REPOSITORY_URI="$AWS_ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com/demos/ecr-demo"
build:
commands:
# Dockerビルドの実行
- docker build -t ecr-demo:$COMMIT_HASH .
# ビルドしたDockerイメージを確認
- docker images
# テストとしてDockerイメージの実行
- docker run ecr-demo:$COMMIT_HASH
# タグを付けてプッシュ準備
- docker tag ecr-demo:$COMMIT_HASH $REPOSITORY_URI:$COMMIT_HASH
- docker tag $APP_NAME:$COMMIT_HASH $REPOSITORY_URI:latest
post_build:
commands:
# イメージのプッシュ
- docker push $REPOSITORY_URI:$COMMIT_HASH
- docker push $REPOSITORY_URI:latest
latestも同時に与えている
![](https://assets.st-note.com/img/1731410399-EBAGcX8yY7NkiR1pHFbD3JvM.png?width=1200)
ただし、イメージの内容に変更がない場合はこのように1つにまとまってしまうこともある。これは後でみていこう。
app_nameの分離
あと、気になるところとしては ecr-demo というアプリ名がベタっと書かれているところであったりもするのだが、これを環境変数に分離してしまう。
% cat buildspec.yml
version: 0.2
env:
variables:
APP_NAME: ecr-demo
phases:
pre_build:
commands:
- COMMIT_HASH=$(echo $CODEBUILD_RESOLVED_SOURCE_VERSION | cut -c 1-7)
- AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
- "echo AWS account ID: $AWS_ACCOUNT_ID"
# ECRにログイン
- aws ecr get-login-password --region $AWS_REGION | docker login --username AWS --password-stdin $AWS_ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com
- REPOSITORY_URI="$AWS_ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com/demos/$APP_NAME"
build:
commands:
# Dockerビルドの実行
- docker build -t $APP_NAME:$COMMIT_HASH .
# ビルドしたDockerイメージを確認
- docker images
# テストとしてDockerイメージの実行
- docker run $APP_NAME:$COMMIT_HASH
# タグを付けてプッシュ準備
- docker tag $APP_NAME:$COMMIT_HASH $REPOSITORY_URI:$COMMIT_HASH
- docker tag $APP_NAME:$COMMIT_HASH $REPOSITORY_URI:latest
post_build:
commands:
# イメージのプッシュ
- docker push $REPOSITORY_URI:$COMMIT_HASH
- docker push $REPOSITORY_URI:latest
最後に/demos/というpathがハードコードされているのであるが、これを分離させるかはまあ好みってことだけど、「/」から初まるとurlが // みたいにスラッシュが重複しちゃうので
env:
variables:
APP_NAME: ecr-demo
APP_PATH: /demos/ecr-demo
phases:
pre_build:
commands:
# APP_PATHが/で始まる場合、そのスラッシュを削除
- APP_PATH=$(echo $APP_PATH | sed 's/^\/\+//')
とかして削除しないといけないかもしれない。
Dockerfileに手を加えてみる
ここで現在のDockerfileは
FROM public.ecr.aws/docker/library/alpine:latest
CMD echo 'Hello from Amazon ECR Alpine Docker!'
このようなシンプルな2行で収まっているため、ちょっと変更する。たとえば
CMD echo 'Hello from Amazon ECR Alpine Docker!'
これを外部スクリプトに移動してみよう。
まず、entrypoint.shを作成する
#!/bin/sh
echo "Hello from Docker! The current date and time is: $(date)"
chmodする
chmod +x entrypoint.sh
Dockerfileを以下のように更新する
FROM public.ecr.aws/docker/library/alpine:latest
COPY entrypoint.sh /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
git add .
git commit -m "Add entrypoint script and update Dockerfile for custom entrypoint"
などしてgit pushする
% git push
Username for 'https://gitlab.com': catatsumuri
Password for 'https://catatsumuri@gitlab.com':
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 2 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 411 bytes | 411.00 KiB/s, done.
Total 3 (delta 1), reused 0 (delta 0), pack-reused 0
To https://gitlab.com/catatsumuri/ecr-demo.git
63518fc..d0e93dd main -> main
そうすると
![](https://assets.st-note.com/img/1731446383-Ls4ePHthYfj8BDmznT6GcZAN.png?width=1200)
こんな感じで出力され、またECRには
![](https://assets.st-note.com/img/1731446414-aj7oQAkXOEpnM89JThvItKiF.png?width=1200)
こういった形で格納されていく。
次回
とか
とかでやったようなイメージの起動を、この作成したイメージを利用して行うと同時に、pipelineでイメージの変更をおこなった時の戦略を考えていってみよう