見出し画像

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 を使っているかというのはこの辺に由来

https://zenn.dev/bicstone/articles/amazon-ecr-public-gallery

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も同時に与えている


ただし、イメージの内容に変更がない場合はこのように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

そうすると

こんな感じで出力され、またECRには

こういった形で格納されていく。

次回

とか

とかでやったようなイメージの起動を、この作成したイメージを利用して行うと同時に、pipelineでイメージの変更をおこなった時の戦略を考えていってみよう



いいなと思ったら応援しよう!