TenForward

技術ブログ。はてなダイアリーから移転しました

docker で 32bit コンテナイメージを作成する

(2013/10/09 追記) docker バイナリは static link されるようになっていますので以下の対応は不要です.

lxc を使って x86_64 環境で 32bit (x86) 環境のコンテナを起動するのは簡単です.コンテナツリーを 32bit のバイナリで揃えれば OK です.docker の Public images には 32bit のものはあまりないので,lxc で 32bit コンテナを 64bit ホスト上で動かすのと同じ感覚で docker で 32bit コンテナを作成したらハマりました.(^_^;)

コンテナツリーは適当に 32bit ツリーとなるように作成します.出来上がったところでおもむろに

  1. docker の image を作成します.
    $ cd $CONTAINER_ROOT ; sudo tar -cv . | docker import -
  2. docker tag でリポジトリとタグをつけます.
    $ docker tag d2e86efbcac2 tenforward/centos-x86 latest
  3. これで image としてちゃんと見えます.
    $ docker images
    REPOSITORY TAG ID CREATED SIZE
    : (snip)
    tenforward/centos-x86 latest d2e86efbcac2 7 minutes ago 422 MB (virtual 422 MB)
  4. ここで run すると
    $ docker run -t -i tenforward/centos-x86 /bin/bash
    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'
    がーん,動きません.(2013/07/05追記: 当初,以下に書いた動かない理由とは別のエラー出力を貼り付けていました.修正しました.)

これは先のエントリで,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 追記)

  • 色々試行錯誤中なので上記は消しました.とりあえず を覗いてもらえれば何かイメージがあるかも (2013/07/10 追記)