1クール続けるブログ

とりあえず1クール続けるソフトウェアエンジニアの備忘録

linux/amd64でlinux/arm64アーキテクチャのイメージをPullする

AWSでm6g/r6g/c6gとarmのCPUが乗った新世代のインスタンスタイプが続々とGAになりましたね。
自分の運用している環境でコストとパフォーマンスにどのくらいに改善が見られるのか楽しみですね。EKSのOptimized AMIのARM版はまだGAされていませんが、もしされることになれば、是非そちらにも導入してみたいところ!

皆さんは、node-exporterなど、DockerHubから直接Pullしても動かせるものはどうしているのでしょうか。
Amazon ECRなどはSLAが存在しているし、障害があったときにサポートへの問い合わせから状況把握が出来たりするので、マネージドなプライベートコンテナレジストリにPushしておくのが良いのではないかなと思っております。

今後出てくるユースケースとして、「linux/amd64アーキテクチャインスタンス(例えばJenkinsとか)からlinux/arm64のコンテナイメージをDockerHubからpullして、ECRなりにpushする」というのが出てくるのではと思います。

pushはともかく、docker pull imageで取得してくるイメージはdockerコマンドを発行するアーキテクチャに依存してしまうので、linux/amd64でarmイメージをpullするにはひと手間加える必要がありますね。

experimentalの --platform オプションを使う

Docker for Macの場合には下記のようにPrefernces > Docker Engineexperimentaltrueにしておく。

f:id:jrywm121:20200613150207p:plain

Linuxの場合は、--config-fileの指定が無ければ、/etc/docker/daemon.jsonを編集する。

docs.docker.com

docker pull --platform linux/arm64 nginx

docker inspect nginx@sha256:21f32f6c08406306d822a0e6e8b7dc81f53f336570e852e25fbe1e3e3d0d0133 | grep -E "Os|Architecture" 
        "Architecture": "arm64",
        "Os": "linux",,

コンテナイメージハッシュを指定してpullする

DockerHubのAPIを理由してlinux/arm64のイメージを取得する。

ARM64_DIGEST=$(curl -s 'https://registry.hub.docker.com/v2/repositories/prom/node-exporter/tags/' |
    jq -r '.results[] | select(.name == "v1.0.0") | .images[] | select(.os == "linux" and .architecture == "arm64") | .digest')
docker pull prom/node-exporter@${ARM64_DIGEST}

platformがexperimentalでなくなってくれると非常に嬉しいなあと思っています。