本記事は、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