クロスDockerのためのDockerfile

dockerhubにはx86, x86_64以外のアーキテクチャ用のコンテナもいくつかpushされています。これをqemuを利用したクロス環境のDockerとして動作させるためには、以下の準備が必要です。

(1) binfmt_misc でクロスで動かしたいアーキテクチャのELFファイルの設定がされていること
(2) コンテナ内の/usr/bin にstatic linkされたユーザーモードqemuのバイナリがコピーされていること

(1)はsudo apt-get install qemu-user-static を行ったときに自動的に行われます。
昨日の記事で使用したericvh/arm64-ubuntu-dev はすで(2)がなされた状態でdockerhubに置かれていたので、すぐにクロスで動かすことができました。

(1)だけで(2)がされていない状態では、docker runしたときに no such file or directoryのエラーになります。(1)で設定されたstatic linkされたユーザーモードqemuのバイナリがコンテナの名前空間で見つからないためです。

githubのarmel/debian:jessieを実行しようとすると正にこのエラーが発生します。

$ docker run -it armel/debian:jessie /bin/bash
2014/08/19 13:31:22 no such file or directory
2014/08/19 22:31:22 Error response from daemon: Cannot start container d9a83fa5578a44fd168bfc4d49a24a5a02e8cd88e6d5db46658e299582d61d56: no such file or directory

これを解決するには、qemu-arm-staticをコンテナ内の/usr/binにコピーします。
それを行うためのDockerfileは以下のようになります。

FROM armel/debian:jessie
ADD ./qemu-arm-static /usr/bin/

RUNコマンドを追加するときには、必ず "ADD ./qemu-arm-static /usr/bin/"より後ろに追加してください。そうでないとそのコマンドの実行がno such file or directoryのエラーになります。

このDockerfileをカレントディレクトリに置いて以下を実行して新たなコンテナを作成します。

$ cp /usr/bin/qemu-arm-static .
$ docker build --tag="koba/debian_armel" .
Sending build context to Docker daemon 6.195 MB
Sending build context to Docker daemon 
Step 0 : FROM armel/debian:jessie
 ---> 693f87a07cac
Step 1 : ADD ./qemu-arm-static /usr/bin/
 ---> Using cache
 ---> aaa2d71f8e2c
Successfully built aaa2d71f8e2c

このコンテナには koba/debian_armel のタグをつけたので、以下のようにして実行できます。

$ docker run -it koba/debian_armel /bin/bash
root@56400d6857a3:/# uname -m
armv7l
root@56400d6857a3:/#