エラーの原因
Dockerを使用して立ち上げたRailsコンテナのプロセスを「Ctrl + c」で強制終了し、「rails s」で再びサーバーを立ち上げようとすると" a server is already running" というエラーが発生することがあります。
原因は、pids/server.pid というファイルが残っていることです。手動ではありますが、コマンドラインで以下を実行すれば解決します。
rm tmp/pids/server.pid
毎回のように丁寧にDockerコマンドを入力すれば問題は発生しませんが、「Ctrl + c」で楽にサーバーを終了させたいというのが人間だと思います。しかし、エラーに怯え、エラーが発生した際に毎回手動対応することは大変に面倒なので、削除を自動化するシェルスクリプトを書きます。
まずは、Railsアプリのあるディレクトリに「delete-server-pid.sh 」というファイルを作成します。以下のコマンドを実行しても良いです。
touch delete-server-pid.sh
作成したファイルにシェルスクリプトを書きます。
#!/bin/sh
set -e
if [ -f tmp/pids/server.pid ]; then
rm tmp/pids/server.pid
fi
exec "$@"
次にコマンドラインで以下を実行し、パーミッションを設定します。
chmod +x delete-server-pid.sh
あとは、Railsのために用意されたDockerfileに作成したシェルスクリプトを実行するように設定します。
# Start the main process.
CMD ["rails", "server", "-b", "0.0.0.0"]
ENTRYPOINT [ "./delete-server-pid.sh " ]
CMD ["bin/rails", "s", "-b", "0.0.0.0"]
これで、server.pidがあれば削除されるように自動化されました。
参考書籍/参考資料
コード自体はこちらに書かれています。
https://stackoverflow.com/questions/35022428/rails-server-is-still-running-in-a-new-opened-docker-container
書籍ですが、シェルスクリプトの詳しい解説はこちらにあります。
https://www.amazon.co.jp/Docker-Rails-Developers-Applications-Everywhere/dp/1680502735