编写一个Bash脚本,用于将image推送到使用Terraform创建的ECR存储库中
动机
当我们思考到需要频繁进行「push」操作时,执行命令也变得麻烦起来。
目录结构设计
在Makefile中执行scripts目录下的脚本。
将脚本直接放置在根目录下也不会改变代码。
.
├── Makefile
├── scripts
└── terraform
前提是必须的 (The premise is necessary)
我们需要从Terraform获取ECR存储库的URL。
在这里,我们可以通过terraform output来获取URL。
也可以直接将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的输出值赋给了REGION变量,并且再次将双引号移除后重新赋值。
当准备好所需的变量后,构建、标记和推送图像。
下面的代码是向其中一个微服务user的图像进行推送。
#!/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のまま変えてはいけない。
あなたのユーザネームを使うわけではないので注意しよう。