前提
DockerでRails環境を構築し、突然コンテナが起動しないくなった原因と解決方法について記述します。
本題
dockerのアップデート終了後にdocker-compose up -dで立ち上げても一瞬で終了してしまうことがありました。
原因
すでにサーバーが起動していると認識していたからでした。
まずは、ログを確認します。
$ docker-compose up
確認すると、、、
# 省略
・
・
・
db_1 | 2020-05-28T04:13:02.167787Z 0 [Warning] Insecure configuration for --pid-file: Location '/var/run/mysqld' in the path is accessible to all OS users. Consider choosing a different directory.
db_1 | 2020-05-28T04:13:02.207302Z 0 [Note] InnoDB: Buffer pool(s) load completed at 200528 4:13:02
db_1 | 2020-05-28T04:13:02.234813Z 0 [Note] Event Scheduler: Loaded 0 events
db_1 | 2020-05-28T04:13:02.235265Z 0 [Note] mysqld: ready for connections.
db_1 | Version: '5.7.30' socket: '/var/run/mysqld/mysqld.sock' port: 3306 MySQL Community Server (GPL)
web_1 | => Booting Puma
web_1 | => Rails 5.2.3 application starting in development
web_1 | => Run `rails server -h` for more startup options
web_1 | A server is already running. Check /app/tmp/pids/server.pid.
web_1 | Exiting
上記のように、A server is already running
となっており、サーバーがすでに立ち上がっているから終了してしまっていることがわかります。
tmp/pids/server.pidというファイルが原因となってます。
確認してみると、、、
$ cat tmp/pids/server.pid
1
この1という数字はRails ServerのPID(Process ID)となります。
Linuxでは各プロセスにIDをつけて管理しています。
またDockerでは, プロセスIDが1であるプロセスが終了した場合、コンテナも終了するようになっているとのことです。
解決方法
$ rm tmp/pids/server.pid
上記でtmp/pids/server.pidを削除後、再度立ち上げると無事に立ち上がりました!
$ docker-compose up -d
毎回 rm tmp/pids/server.pid するのも手間であるため、docker-compose.ymlを修正しました。
docker-compose.yml
# 変更前
version: '3'
services:
web:
build: .
command: bundle exec rails s -p 3000 -b '0.0.0.0'
volumes:
- .:/app
ports:
- 3000:3000
depends_on:
- db
tty: true
stdin_open: true
environment:
- "SELENIUM_DRIVER_URL=http://selenium_chrome:4444/wd/hub"
docker-compose.yml
# 変更後
version: '3'
services:
web:
build: .
command: /bin/sh -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'
volumes:
- .:/app
ports:
- 3000:3000
depends_on:
- db
tty: true
stdin_open: true
environment:
- "SELENIUM_DRIVER_URL=http://selenium_chrome:4444/wd/hub"
以上です。