RailsのアプリケーションをDocker環境下で開発しています。
webコンテナ(railsサーバー)、dbコンテナなど複数コンテナの起動をdocker-compose.yml
で管理し、docker-compose up -d
で一挙に立ち上がるようにしているのですが、たまにrailsサーバーのコンテナのみ起動しないことがよくある。
正確に言うと、一度立ち上がるのだけどすぐに終了してしまう。
Starting sample_app ... done
立ち上がったのに
docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 4s21fedfdsd9e0 sample_app "rails s -p 3000 -b …" 57 seconds ago Exited (1) 29 seconds ago sample_app
ステータスがExited (1)
になっている。
よくある原因1 pidファイルが残っている
これがもっとも多い原因。
sample_app | A server is already running. Check /app/tmp/pids/server.pid. sample_app | => Booting WEBrick sample_app | => Rails 5.0.6 application starting in development on http://0.0.0.0:3000 sample_app | => Run `rails server -h` for more startup options sample_app | Exiting
ログを見ると「サーバーがすでに起動しているからpidファイルをチェックして」って書いてあります。
何らかの原因でコンテナが強制終了された場合などは、コンテナ自体は停止しているけどpidファイル(railsデフォルトのwebサーバーであるpumaの起動に係るファイル)が残存してしまっている可能性がある。
なのでpidファイルを削除すればOK
rm tmp/pids/server.pid
ちなみにこれコンテナ入って消すのかなとか最初思ったのだけど、ホスト側のマウントしているルートディレクトリでrmすればOK。
returnしても何も起こらないけど消えている模様。
今回ハマった原因:configがおかしい
今回もうまく起動できず「あーまたpidか」と思ったら違う様子。
rm tmp/pids/server.pid rm: tmp/pids/server.pid: No such file or directory
そんなファイルないよと怒られた。
どうやら違う原因があるようです。
ログを見てみると
/sample_app/config/initializers/kaminari_config.rb:2:in `block in <main>': undefined local variable or method `config' for main:Object (NameError)
普通にさっきいじったページネーションのconfigがおかしいだけだった。
(そもそもconfigをいじったからコンテナを立ち上げ直そうとしたのだから、もっと早く原因に気づくべきだった)
無事に修正してコンテナ立ち上げることができました。
ちなみに
「docker 立ち上がらない」とかでググると以下コマンドでログを見ろと書かれているのだけど
docker logs (もしくはdocker-compose logs)
これだとログが溜まってた時にしんどいので、個人的には以下が好き
docker-compose up
普段はdocker-compose up -d
でバックグラウンドで実行するけど、-dオプションを除くと今起動したもののログだけ出せるので早く原因が掴める。
と思っていたら、どうやら最新のログだけ出す方法もあるみたいです。こっちでも良いかも
Dockerのログが大きくなりすぎたから最新のだけ見たい - Qiita
参考
docker-compose upしたときに「A server is already running.」って言われないようにする - Qiita