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 Engine
で experimental
をtrue
にしておく。
Linuxの場合は、--config-file
の指定が無ければ、/etc/docker/daemon.json
を編集する。
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でなくなってくれると非常に嬉しいなあと思っています。