はじめに
- 検証用環境で確認済のECRイメージを他環境に展開する際、設定ファイルを上書きした状態で再プッシュが必要な場面がありました。
- その為、以下を実施するシェルを作成しました。
- 元となるECRのイメージをプル
- イメージを基にコンテナを起動し、設定ファイルを上書きして保存
- 新規作成したコンテナイメージを別環境のECRにプッシュ
準備
- アカウントA(元となるECRイメージ)、アカウントB(ECRイメージのプッシュ先)
- EC2を用意(アカウントB側)
- EC2にDocker、aws-cliのインストール
- EC2のIAMロールにECRからプルできる権限を付与
- アカウントA側のECRのパーミッションの設定(アカウントBからのプルを許可)
使い方
以下のシェルを叩く想定です。
引数としてECRのイメージURIを渡します。
/bin/sh container-rebuild.sh ECRのイメージURI
シェル詳細
container-rebuild.sh
##########################
# 変数定義
# 再ビルド対象イメージのアカウントID
ACCOUNT_ID_PRE_IMAGE="アカウントID"
# 再ビルド対象イメージのリージョン
REGION_PRE_IMAGE="リージョン名"
# ビルド後イメージのアカウントID
ACCOUNT_ID_BUILD_IMAGE="アカウントID"
# ビルド後イメージのリージョン
REGION_BUILD_IMAGE="リージョン名"
# ビルド後イメージのECRリポジトリ名
REPO_NAME_BUILD_IMAGE="ECRリポジトリ名"
#ビルド後イメージURI
BUILD_IMAGE_URI=${ACCOUNT_ID_BUILD_IMAGE}.dkr.ecr.${REGION_BUILD_IMAGE}.amazonaws.com/${REPO_NAME_BUILD_IMAGE}:任意のイメージタグ名
##########################
# コンテナイメージ再構築処理
# コンテナ名を定義
CONTAINER_NAME="tmpContainer"
# ECRの認証トークン取得
aws ecr get-login-password --region ${REGION_PRE_IMAGE} | docker login --username AWS --password-stdin ${ACCOUNT_ID_PRE_IMAGE}.dkr.ecr.${REGION_PRE_IMAGE}.amazonaws.com
# シェル実行時の引数(イメージURI)を元に、イメージをプル
docker pull $1
# コンテナ起動
docker run -d --name ${CONTAINER_NAME} $1
# 設定ファイルの上書き等
任意の設定
# 新規イメージを保存
docker commit ${CONTAINER_NAME} ${BUILD_IMAGE_URI}
##########################
# コンテナイメージを別アカウントのECRへプッシュ
# ECRの認証トークン取得
aws ecr get-login-password --region ${REGION_BUILD_IMAGE} | docker login --username AWS --password-stdin ${ACCOUNT_ID_BUILD_IMAGE}.dkr.ecr.${REGION_BUILD_IMAGE}.amazonaws.com
# イメージをプッシュ
docker push ${BUILD_IMAGE_URI}
##########################
# 後片付け処理
# コンテナ停止
docker stop ${CONTAINER_NAME}
echo "再ビルド用のコンテナを停止しました"
# コンテナ破棄
docker rm ${CONTAINER_NAME}
echo "再ビルド用のコンテナを破棄しました"
# コンテナイメージ削除
docker rmi $1
docker rmi ${BUILD_IMAGE_URI}
おわりに
- 今回はEC2上で動かす想定なので、最後にコンテナ停止、破棄、イメージの削除を行う事で「何回もシェルを利用している内にマシンの容量を圧迫しない」ようにしています。
- 項目「コンテナイメージ再構築処理」内の「設定ファイルの上書き」の処理内容を変更して利用頂けると良いかと思います。
参考文献
https://docs.aws.amazon.com/ja_jp/AmazonECR/latest/userguide/getting-started-cli.html