Docker イメージはCPUアーキテクチャが合致していないと起動できない ~ exec format error
- POSTS
はじめに システム開発において、Docker を利用している方は多いのではないでしょうか。
Docker イメージは可搬性に優れており、検証環境でビルドしたイメージを本番環境に持ち込むことで、同一のアプリケーション実行環境を再現できます。
これにより、「環境差異による不具合」を減らせる点が、コンテナ技術の大きな強みです。
ただし、この可搬性は万能ではありません。
CPUアーキテクチャ(例:x86_64 と arm64)によっては、同一イメージでも動作しない場合があります。
そのため、「イメージさえあればどこでも同じように動く」という理解ではなく、実行環境との整合性を意識した運用が重要になります。
2. 本記事の結論 CPUアーキテクチャが一致しないとコンテナは起動できないです。
対策は、アーキテクチャを揃える or マルチアーキテクチャ対応が必要です。
3. 検証環境 3.1 ビルド環境 OS Amazon Linux 2 インスタンスタイプ t3.micro 3.2. コンテナ起動環境 OS Amazon Linux 2023 インスタンスタイプ t4g.micro 4. Dockerイメージのビルドとpush 4.1. CPU アーキテクチャの確認 sh-4.2$ uname -m x86_64 4.2. Docker から ECR にログインする sh-4.2$ aws ecr get-login-password --region us-west-2 | docker login --username AWS --password-stdin xxxxxxxxxx.dkr.ecr.us-west-2.amazonaws.com WARNING! Your password will be stored unencrypted in /home/ssm-user/.docker/config.json. Configure a credential helper to remove this warning. See https://docs.docker.com/engine/reference/commandline/login/#credentials-store Login Succeeded 4.3. ビルド実施 sh-4.2$ sudo docker build -t cpu-arch-test . [+] Building 3.3s (5/5) FINISHED docker:default => [internal] load build definition from Dockerfile 0.0s => => transferring dockerfile: 125B 0.0s => [internal] load metadata for docker.io/library/ 〜以下、略〜 4.4. イメージにタグを付与する sh-4.2$ sudo docker tag cpu-arch-test:latest xxxxxxxxxxxxx.dkr.ecr.us-west-2.amazonaws.com/cpu-arch-test:latest 4.5. ECR にイメージをプッシュする sh-4.2$ sudo docker push xxxxxxxxxxxxx.dkr.ecr.us-west-2.amazonaws.com/cpu-arch-test:latest The push refers to repository [xxxxxxxxxxxxx.dkr.ecr.us-west-2.amazonaws.com/cpu-arch-test] 3baf45fb4b5e: Pushed 538812a4b9bd: Pushed latest: digest: sha256:84d1632a2780f1e78d0857d90ce20707cda6b0b7d817ed52fb25c09e8dfd6057 size: 742 5. 別環境でpullして実行 5.1. CPU アーキテクチャを確認 sh-5.2$ uname -m aarch64 5.2. Docker から ECR にログインする sh-5.2$ aws ecr get-login-password --region us-west-2 | \ sudo docker login \ --username AWS \ --password-stdin xxxxxxxxxxxxx.dkr.ecr.us-west-2.amazonaws.com 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 5.3. ECR からイメージを Pull する sh-5.2$ sudo docker pull xxxxxxxxxxxxx.dkr.ecr.us-west-2.amazonaws.com/cpu-arch-test:latest latest: Pulling from cpu-arch-test 2f7571f14c6f: Pull complete 04f0c7cfe47b: Pull complete Digest: sha256:84d1632a2780f1e78d0857d90ce20707cda6b0b7d817ed52fb25c09e8dfd6057 Status: Downloaded newer image for xxxxxxxxxxxxx.dkr.ecr.us-west-2.amazonaws.com/cpu-arch-test:latest xxxxxxxxxxxxx.dkr.ecr.us-west-2.amazonaws.com/cpu-arch-test:latest 5.4. コンテナを起動する exec /bin/bash: exec format error というエラーが出力され、コンテナの起動ができない。