Rails
docker
docker-compose

Rails アプリケーションを Docker を使って開発する、ほとんどの人が通る(であろう)道

More than 1 year has passed since last update.

本記事は、A server is already running の対処です。これについては記事もたくさん存在していますし何も新しいことはありません。
ただ、Rails × Docker で開発する人より多くの人に見てもらえることを目的として書きました。
Rails の A server is already running と聞いて「ああ、あれのことか」と思った方は本記事は読み飛ばしてください。

docker-compose.yml

db:
  image: postgres
web:
  build: .
  # コンテナ立ち上げ時に開発用サーバを起動
  command: bundle exec rails s -p 3000 -b '0.0.0.0'
  volumes:
    - .:/myapp
  ports:
    - "3000:3000"
  links:
    - db

A server is already running.

コンテナを立ち上げますが、失敗しています。

$ docker-compose up -d
$ docker-compose ps
        Name                       Command               State     Ports
--------------------------------------------------------------------------
railsprojectdocker_db_1    /docker-entrypoint.sh postgres   Up       5432/tcp
railsprojectdocker_web_1   bundle exec rails s -p 300 ...   Exit 1

以下のコマンドでログを確認します。

$ docker-compose logs
~
web_1 | => Booting WEBrick
web_1 | => Rails 4.2.4 application starting in development on http://0.0.0.0:3000
web_1 | => Run `rails server -h` for more startup options
web_1 | => Ctrl-C to shutdown server
web_1 | A server is already running. Check /myapp/rails-app/tmp/pids/server.pid.
web_1 | Exiting

問題と対処

Rails に付随しているWEBサーバが正常に終了していない。
docker-compose kill や 何かの拍子でコンテナが終了すると起きてしまいます。

server.pid に pid の情報が保持されたまま終了

pid は、開発用WEBサーバを起動するときに tmp/pids/server.pidに書き込まれ、終了するときに削除されます。
server.pid に pid が書かれていると開発用WEBサーバが起動中(プロセスがある)と判断されてしまいます。

pid の情報を削除

server.pid に書かれた pidを削除する、もしくはserver.pidを削除します。
server.pid を削除しても、rails serverを実行した時に自動で作成されます。

$ rm railsproject-ui/tmp/pids/server.pid