LoginSignup
5
2

More than 3 years have passed since last update.

前提

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"

以上です。

5
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2