🏷️

ECR のタグを付け替えるハンズオン

2022/07/20に公開

この記事について

ECR イメージのタグを付け替える方法の記事を読んだが、ちゃんと理解できた実感がなかったのでハンズオン記事を作成して理解を深めようと試みた。
https://docs.aws.amazon.com/ja_jp/AmazonECR/latest/userguide/image-retag.html

ハンズオンでは、ECR リポジトリ作成・イメージのプッシュ・タグの付け替え・リソースの削除まで行う。
AWS CLI の権限さえ満たしていれば再現性のある手順になるよう考慮したので、気軽に試していただきたい。

ECR リポジトリを作成

aws ecr create-repository \
  --repository-name sample-greet \
  --image-tag-mutability MUTABLE

※ latest タグを上書きするので --image-tag-mutability MUTABLE にしている

イメージをプッシュ

プッシュするイメージを構成する Dockerfile を作成する

cat << EOF > Dockerfile
FROM alpine:latest
ENTRYPOINT [ "echo", "Hello," ]
EOF

イメージをプッシュする

以下のスクリプトで、sample-greet リポジトリに「v1.0.0」と「latest」タグのイメージがプッシュされる。

region=$(aws configure get region)
acount_id=$(aws sts get-caller-identity --query Account --output text)
ecr_host="$acount_id.dkr.ecr.$region.amazonaws.com"
image_uri="$ecr_host/sample-greet"

# 認証情報を取得
aws ecr get-login-password --region $region | docker login --username AWS --password-stdin $ecr_host

# イメージ v1.0.0 をビルド&プッシュ
docker build . -t sample-greet
docker tag sample-greet "${image_uri}:v1.0.0"
docker push "${image_uri}:v1.0.0"

# Dockerfile を修正して latest 扱いにする
cat << EOF > Dockerfile
FROM alpine:latest
ENTRYPOINT [ "echo", "こんにちは、" ]
EOF

# イメージ latest をビルド&プッシュ
docker build . -t sample-greet
docker tag sample-greet "${image_uri}:latest"
docker push "${image_uri}:latest"

以下のコマンドで、sample-greet リポジトリにプッシュしたイメージを確認できる。

aws ecr list-images \
  --repository-name sample-greet

イメージ v1.0.0 に latest タグを付ける

# 「v1.0.0」の imageManifest を取得
MANIFEST=$(
  aws ecr batch-get-image \
    --repository-name sample-greet \
    --image-ids imageTag=v1.0.0 \
    --output json \
  | jq --raw-output --join-output '.images[0].imageManifest' \
)
# 「v1.0.0」に latest タグを付与する
aws ecr put-image \
  --repository-name sample-greet \
  --image-tag latest \
  --image-manifest "$MANIFEST"

以下のコマンドで、「v1.0.0」と「latest」の imageDigest が同一になったことが確認できる。

aws ecr list-images \
  --repository-name sample-greet

後片付け

# リポジトリ削除( `--force` オプションによってイメージもまとめて削除)
aws ecr delete-repository \
  --repository-name sample-greet \
  --force

# ファイル削除
rm Dockerfile

以上。

GitHubで編集を提案

Discussion