箱のプログラミング日記。

えんじにあ奮闘記

Dockerのコンテナが立ち上がらない【Rails】

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