docker で 32bit コンテナイメージを作成する
(2013/10/09 追記) docker バイナリは static link されるようになっていますので以下の対応は不要です.
- 以下を読まなくてもここを読めば OK (^^) → 32-bit container on a 64-bit system · Issue #611 · docker/docker · GitHub
lxc を使って x86_64 環境で 32bit (x86) 環境のコンテナを起動するのは簡単です.コンテナツリーを 32bit のバイナリで揃えれば OK です.docker の Public images には 32bit のものはあまりないので,lxc で 32bit コンテナを 64bit ホスト上で動かすのと同じ感覚で docker で 32bit コンテナを作成したらハマりました.(^_^;)
コンテナツリーは適当に 32bit ツリーとなるように作成します.出来上がったところでおもむろに
- docker の image を作成します.
$ cd $CONTAINER_ROOT ; sudo tar -cv . | docker import -
- docker tag でリポジトリとタグをつけます.
$ docker tag d2e86efbcac2 tenforward/centos-x86 latest
- これで image としてちゃんと見えます.
$ docker images
REPOSITORY TAG ID CREATED SIZE
: (snip)
tenforward/centos-x86 latest d2e86efbcac2 7 minutes ago 422 MB (virtual 422 MB) - ここで run すると
$ docker run -t -i tenforward/centos-x86 /bin/bash
がーん,動きません.(2013/07/05追記: 当初,以下に書いた動かない理由とは別のエラー出力を貼り付けていました.修正しました.)
lxc-start: No such file or directory - failed to exec /sbin/init
lxc-start: invalid sequence number 1. expected 2
lxc-start: failed to spawn '9581d0ed64a74af53c0838b29d97070a1f7ef84507decf07990aa66f0c28906a'
これは先のエントリで,docker run した時は,docker バイナリ自身をコンテナ内の /sbin/init に bind mount して実行しているというところに鍵が.(2013/09/02 追記: ここは 0.6 以降では /sbin/init の代わりに /.dockerinit にバインドマウントされるようになってます -> Fix to "Inject dockerinit at /.dockerinit" by sridatta · Pull Request #1267 · docker/docker · GitHub)
つまり,コンテナ内の /sbin/init は 64bit バイナリであるホスト環境の docker なので,32bit ライブラリしか入っていないコンテナでは動かないということです.
ここで
$ ldd /usr/bin/docker linux-vdso.so.1 => (0x00007ffff41db000) libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f4b59668000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f4b592a9000) /lib64/ld-linux-x86-64.so.2 (0x00007f4b5988c000)
というわけなので,
# cd $CONTAINER_ROOT # mkdir lib64 # mkdir lib/x86_64-linux-gnu/ # cp /lib/x86_64-linux-gnu/libc.so.6 lib/x86_64-linux-gnu/libc.so.6 # cp /lib/x86_64-linux-gnu/libpthread.so.0 lib/x86_64-linux-gnu/libpthread.so.0 # cp /lib64/ld-linux-x86-64.so.2 lib64/ld-linux-x86-64.so.2
と 64bit のライブラリをコピーして,再度 docker import を実行します.
$ cd $CONTARINER_ROOT $ sudo tar -c . | docker import - ba3cb64abcf2 $ docker tag tenforward/centos-x86 $ docker images | grep tenforward tenforward/centos-x86 latest ba3cb64abcf2 2 minutes ago 424.1 MB (virtual 424.1 MB) $ docker run -t -i tenforward/centos-x86 /bin/bash bash-4.1#
はい.無事実行できました.:-)
(2013/07/06 追記) 作成したイメージを公開しましたよ.
(2013/07/10 追記)