docker-composeでコンテナが起動しない

通常、docker-compose up をすれば、docker-composeで指定されたサービスに紐付くコンテナが起動すると思います。
ところが、なぜかdocker-compose upでコンテナが起動しても、すぐに落ちてしまうことがありました。
具体的には下記のような状態になります。

$ docker-compose up 
Name   Command   State   Ports
------------------------------
test   /bin/bash exit 0

しかし、下記のようにdocker run では起動できる。
※このdocker-composeではDockerfileをbuildするようにしていた。

$ docker run --name test -ti centos:latest /bin/bash

分かる人にはこれだけみてすぐわかる方もいると思いますが、docker初心者の私はしばらくわからず色々調べてやっと解決することができました。

参考サイト

docker-compose.ymlの対象のコンテナに下記を追加してあげるだけでした。

tty: true

要は/bin/bashを実行しているので、ttyを割り当てないと、継続して起動できないということでした。
確かにdocker run では-t つけてた…。

docker runのリファレンスにも同様のことが記載されていて、

(シェルのような)インタラクティブなプロセスでは、コンテナのプロセスに対して tty を割り当てるために、 -i -t を一緒に使う必要があります。

たしかに、なるほど。という気持ちでした。
この辺はいつも意識しないので、言われてみればそうかという感じです。
こうやってDockerの癖みたいのがわかってくると、かなり楽しいです。

また、一つDockerの気持ちが少しわかった日でした。


最近この記事へのアクセスが増えてきたので、直近であった事例を追記。
会社の人が、docker execで起動するのに、docker-compose up -dで固まる(?)ような症状になったことがありました。
この時はどうやら名前解決に時間がかかっていたようで、MacのDNS参照先を変更することで解決しました。
具体的には、
システム環境設定>ネットワーク>接続が一番上のネットワークの詳細>DNSに8.8.8.8を追加。

※8.8.8.8はGoogleのPublicDNSで、もう一つ8.8.4.4を追記しておくと良いです。他には1.1.1.1はCloudflare事業者が公開しているPublicDNSなので、8.8.8.8と8.8.4.4と1.1.1.1を追加しておくと良いかもです。