Docker の init 起動がうまくいかない
ビルドした後のイメーで run しても init がうまく動いてくれないことがある。
だいたいその場合は
# DOCKER VERSION 0.9.0 docker stop CONTAINER ID(or NAMES) docker start CONTAINER ID(or NAMES)
をしてあげると動いてくれる。
running systemd inside docker arch container hangs or segfaults #3629
コレがそれっぽいな。
ADD foo /bar/
ADD の書き方を間違えて気がついた。
#Docker-VERSION 0.9.0
ADD foo /bar
こんな感じで間違えてましたが、エラーで終了せずにあたかもまだ動いているのな状態で止まりました。
ビルド中でも docker ps で何が動いているのか確認できるので見てみたのですが、何もありませんでした。
docker ps -a でみると STATUS が Exit のしかなくビルドが止まっていることに気が付きました。
0.9.0以前はこのミスはエラーになったはずではっと。
うーん。なんだろう。
0.9.0 を試したかった。
Docker が0.9.0を出したので試しそうと思い手元のboot2docker のバージョン上げましたがこっちはまだ0.8.1だったので無理やり0.9.0にしてみた。
上記を参考にバイナリを更新してみたらうまくいきました。
※細かくチェックしているわけではないので本当にうまくいってるかは不明です。
手順は
wget https://get.docker.io/builds/Linux/x86_64/docker-latest -O docker chmod +x docker chown root:root docker killall docker mv docker /usr/local/bin/docker /usr/local/bin/docker -d -D -g /mnt/sda1/var/lib/docker -H unix:// -H tcp://0.0.0.0:4243 docker version
こんな感じです。
ただ、自分で作った Dockerfile が lxc ドライバに依存していたので
/usr/local/bin/docker -d -e lxc -D -g /mnt/sda1/var/lib/docker -H unix:// -H tcp://0.0.0.0:4243
で docker を再起動しないとダメでした。
次は依存しないようにしないと。
追記(2014-03-16)
boot2docker の最新バージョンで 0.9.0 が入ってます。
Dockerで複数のプロセスを起動する
/sbin/init を使ってあげれば良さそう。
追加で起動したい物があれば、/etc/init に足してあげる。
ADD foo.conf /etc/init/foo.conf
conf の中は例だけど
start on runlevel [12345] respawn exec /usr/local/bin/foo
こんな感じで。
他にも、supervisor を使うのもいいと思う。
公式にもあるしね。
元々、複数動かそうとして
CMD ["/usr/sbin/sshd", "-D"] CMD ["script/startup.sh"]
や
RUN /usr/sbin/sshd -D RUN sh ./script/startup.sh
といったことが出来なかったのでちょっと調べてみた。