CI/CD で以下のコマンドを実行したかっただけでした。
$ aws ecr get-login-password | docker login --username AWS --password-stdin [AWS Account ID].dkr.ecr.ap-northeast-1.amazonaws.com/my-repository
このコマンドラインには 2 つの実行バイナリが必要です。 AWS CLI v2 と docker です。
つまり、AWS CLI v2 と docker の双方の入ったコンテナイメージが欲しい。
問題
Docker 公式が提供している docker イメージは alpine ベースです。
そして alpine が利用しているのは musl libc です。
一方で、AWS CLI v2 は glibc を利用します。
AWS CLI バージョン 2 では glibc、groff、および less を使用します。これらは、Linux のほとんどの主要なディストリビューションにデフォルトで含まれています。
https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-cliv2-linux.html
musl libc と glibc の齟齬により、インストール手順 に従っても alpine 上に AWS CLI v2 は動作しません。公式においても alpine はサポートされていません。
CentOS、Fedora、Ubuntu、Amazon Linux 1、および Amazon Linux 2 の最近のディストリビューションの 64 ビット版が AWS CLI バージョン 2 でサポートされています。
https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-cliv2-linux.html#cliv2-linux-prereq
この問題を解決するには大きくわけて 2 つのアプローチがありそうです。
- aws cli v2 のコンテナイメージに docker をインストールする
- docker のコンテナイメージに aws cli v2 をインストールする
aws cli v2 のコンテナイメージに docker をインストールすれば良いのでは?
aws cli v2 入りのイメージは Docker Hub 上で amazon/aws-cli として公開されています。こちらは Amazon Linux 2 ベース。
もちろん Amazon Linux 2 に対する docker のインストールは可能です。AWS 公式でも謳っている。
しかし、docker daemon をコンテナ上で起動させるのはそれなりに大変です。 何が現在のプラクティスなのかさっぱり追えていない。
docker のコンテナイメージに aws cli v2 をインストールする
なので、公式のdocker用イメージに AWS CLI v2 をインストールします。 AWS CLI v2 が glibc を要求するのであれば、alpine に glibc をインストールすれば良い。
alpine 向けの glibc ビルドはこちらで提供されています。
僕も以下のコメントを参考にインストールを行いました。
GLIBC_VER=2.31-r0 # install glibc apk --no-cache add binutils curl curl -sL https://alpine-pkgs.sgerrand.com/sgerrand.rsa.pub -o /etc/apk/keys/sgerrand.rsa.pub curl -sLO https://github.com/sgerrand/alpine-pkg-glibc/releases/download/${GLIBC_VER}/glibc-${GLIBC_VER}.apk curl -sLO https://github.com/sgerrand/alpine-pkg-glibc/releases/download/${GLIBC_VER}/glibc-bin-${GLIBC_VER}.apk apk add --no-cache glibc-${GLIBC_VER}.apk glibc-bin-${GLIBC_VER}.apk # install awscliv2 curl -sL https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip -o awscliv2.zip unzip -q awscliv2.zip aws/install
これで、CI/CD 上でコマンドが通るようになります。
$ aws ecr get-login-password | docker login --username AWS --password-stdin $ECR_REPOSITORY WARNING! Your password will be stored unencrypted in /root/.docker/config.json. Configure a credential helper to remove this warning. See https://docs.docker.com/engine/reference/commandline/login/#credentials-store Login Succeeded