ローカルのDockerイメージをECRにpushする

  • AWS
  • ECR
  • Docker

この記事は、構成と文章の整理にAIを使っています。
あくまで読みやすくするための補助で、内容そのものをAIにすべて任せて書いているわけではありませんが、ところどころ相談しながら整えています。

やりたいこと

ローカルでbuildしたDockerイメージをAmazon ECRにpushする。流れは認証→build→tag→pushの4ステップ。

認証

ECRにpushする前に、Dockerをそのレジストリに対して認証させておく必要がある。使うのはaws ecr get-login。

$ aws ecr get-login --profile <profile-name> --no-include-email

これを実行すると、認証情報付きのdocker loginコマンドが標準出力に表示されるので、それをそのまま実行する。

$ docker login -u AWS -p <token> https://<account>.dkr.ecr.<region>.amazonaws.com

--no-include-emailを付けているのは、Docker 17.06以降でdocker loginから-e(email)オプションが廃止されたから。付けないと生成されるコマンドに-e noneが混ざって失敗する。

build

普段どおり。

$ docker build -t <image-name> .

tag

ECRにpushするには、イメージをECRのリポジトリURIの形式にtagし直す必要がある。

$ docker tag <image-name> <account>.dkr.ecr.<region>.amazonaws.com/<image-name>:<image-tag>

push

$ docker push <account>.dkr.ecr.<region>.amazonaws.com/<image-name>:<image-tag>

補足

aws ecr get-loginが出力するdocker loginコマンドは、認証情報がコマンド文字列にそのまま乗る。シェルの履歴やプロセス一覧に残るのでちょっと気持ち悪い。

AWSは今年の2月にaws ecr get-login-passwordという新しいコマンドを出していて、こっちはパスワードをパイプでdocker loginに渡せるので履歴に残らない。

$ aws ecr get-login-password --profile <profile-name> --region <region> | docker login --username AWS --password-stdin <account>.dkr.ecr.<region>.amazonaws.com

AWS CLIが1.17.10以降(またはv2)なら使えるはず。手元ではまだ切り替えて動作確認していない。