通常、docker上で動作するコンテナはホストのCPUアーキテクチャと一致する必要がある。
例えばx86用コンテナはx86マシンでしか動かないし、ARM用コンテナはARMマシンでしか動かない。
しかし、x86上でARMコンテナをビルドしたい場合もでてくる。
そこでQEMUというCPUエミュレータを使用すると異なるCPUアーキのコンテナを動作させることができる。
QEMUの準備
以下のようにQEMUをインストールして、設定をおこなう。
sudo apt-get install qemu binfmt-support qemu-user-static
docker run --rm --privileged multiarch/qemu-user-static --reset -p yes -c yes
Dockerへの設定
コンテナ内に/usr/bin/qemu-aarch64-static
を配置することでARMコンテナをx86で実行することができる。
以下の二通りの実現方法があるので、目的に合わせて使用する。
1. docker runで使用する場合
-v
オプションを使用してqemu-aarch64-static
をコンテナ内にマッピングする。
docker run -it --rm -v /usr/bin/qemu-aarch64-static:/usr/bin/qemu-aarch64-static image_name
2. Dockerfileで使用する場合
事前にqemu-aarch64-static
をカレントディレクトリ(Dockerfileと同じ場所)にcopyしておく。
cp /usr/bin/qemu-aarch64-static .
Dockerfile内でCOPY
コマンドでcopyする。注意点としてはRUN
コマンドよりも前にCOPY
が実行されるようにすること。
COPY ./qemu-aarch64-static /usr/bin/qemu-aarch64-static
# RUN コマンドの前にCOPYする
RUN command_hogehoge
注意点
- CPUエミュレータを使ってARMバイナリを随時x86に翻訳しているため、プロジェクトのビルドなどを実行するととても重くなるため注意
- あくまでもapt等でパッケージをインストールするだけという利用法が無難
参考