動機
pushするイメージが多くなると、コマンドの実行も面倒である。
ディレクトリアーキテクチャ
Makefileからscripts
ディレクトリにあるスクリプトを実行する。
ルートディレクトリに直接スクリプトを置いてもコードは変わらない。
.
├── Makefile
├── scripts
└── terraform
前提
TerraformからECRリポジトリのURLを得る必要がある。
ここでは、terraform output
からURLを取得する。
ハードコーディングしてもよい。
output "region" {
description = "AWS region"
value = var.region
}
output "ecr-user-url" {
description = "user ECR repository url"
value = aws_ecr_repository.user.repository_url
}
コード
push-image.sh
を作成する。
#!/bin/bash
# cd from root dir
cd ./terraform
REGION=`terraform output region`
REGION=`sed -e 's/^"//' -e 's/"$//' <<<"$REGION"`
Terraformのアウトプットには" (ダブルクォーテーションマーク)
がついているため、取り除いてやる必要がある。
上のコードでは、TerraformからのouputをREGION
に代入し、改めてダブルクォーテーションを外して再代入している。
このようにして必要な変数を用意したら、イメージをbuild、tagづけ、pushする。
次のコードはマイクロサービスの一つであるuser
のイメージをpushしている。
#!/bin/bash
# cd from root dir
cd ./terraform
PRODUCT_NAME=example
REGION=`terraform output region`
REGION=`sed -e 's/^"//' -e 's/"$//' <<<"$REGION"`
ECR_USER_URL=`terraform output ecr-user-url`
ECR_USER_URL=`sed -e 's/^"//' -e 's/"$//' <<<"$ECR_USER_URL"`
# back to root dir
cd ../
aws ecr get-login-password --region $REGION | docker login --username AWS --password-stdin $ECR_USER_URL
docker build . -t $PRODUCT_NAME-user -f ./build/package/docker/user/Dockerfile
docker tag $PRODUCT_NAME-user:latest $ECR_USER_URL
docker push $ECR_USER_URL
-
なお、
aws ecr
コマンドを実行するには、.aws/credentials
にアクセスキーなどが必要である。
これがない場合はaws configure
で作成しよう。 -
Dockerfileのファイルパスやタグは適宜書き換えてほしい。
-
docker login
のusernameはAWS
のまま変えてはいけない。
あなたのユーザネームを使うわけではないので注意しよう。