今回達成すること
Railsのサーバが起動しない「A server is already running. Check /tmp/pids/server.pid」のエラー対応を行います。
このエラーがまだ発生していない場合でも、今回の対応をしておくことが賢明です。
A server is already running...エラーとは
このエラーは、前のRailsサーバ起動時に作成された
対応として、サーバ起動の都度
今回のエラー対応の概要
前回、本番環境では
これによりDockerfileにサーバ起動コマンドがなくても本番環境でRailsを動かすことができます。
そこで、Dockerfileのコマンドを
- 本番環境のRails起動コマンド ...
heroku.yml - 開発環境のRails起動コマンド ...
docker-compose.yml
Railsサーバ起動コマンドを移動する
それでは「api」ディレクトリ直下のCMD
命令を削除しましょう。
api/Dockerfile
# 削除する
# CMD ["rails", "server", "-b", "0.0.0.0"]
続いて「root」ディレクトリのcommand
を追加します。
docker-compose.yml
...
api:
build:
context: ./api
args:
WORKDIR: $WORKDIR
# 追加
command: /bin/sh -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
/bin/sh
... シェルの実行。-c
... 引数の文字列をコマンドとして実行するコマンドオプション。rm -f tmp/pids/server.pid
... server.pidファイルの削除。undle exec rails s -p 3000 -b '0.0.0.0'
... Railsサーバの起動。
Dockerイメージをビルドする
Dockerfileを書き換えたのでビルドしておきましょう。
root $ docker-compose build --no-cache api
-
--no-cache
... キャッシュを使用せず、一からイメージを作るオプション。命令を削除しただけの場合、変更が反映されないことがありました。そこで今回はこのオプションをつけて実行しています。
書き換えたDockerイメージの内容を確認する
変更が反映されたか確認してみましょう。
イメージIDの取得
まず、DockerイメージのIDを取得します。
root $ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
udemy_demoapp_v1_api latest c7cd783f4fd4 About an hour ago 699MB
<none> <none> 3ee7026684f7 5 hours ago 699MB
筆者の場合、最新のDockerイメージはlatest
タグでIDは「c7cd783f4fd4」、一個前のDockerイメージIDは「3ee7026684f7」となります。
一個前のイメージを確認
inspect
コマンドでイメージの内容を確認してみましょう。
一個前(CMD
命令削除前)のイメージ情報はどうでしょう。
root $ docker inspect 3ee7026684f7
...
"Cmd": [
"/bin/sh",
"-c",
"#(nop) ",
"CMD [\"rails\" \"server\" \"-b\" \"0.0.0.0\"]"
],
inspect <イメージID>
... Dockerイメージの情報を取得する。
書き換え前のDockerイメージにはrails server
コマンドが表示されていますね。
最新のイメージを確認
次は最新のlatest
タグを確認してみましょう。
root $ docker inspect c7cd783f4fd4
...
"Cmd": [
"/bin/sh",
"-c",
"#(nop) COPY dir:3d6cba78846b795326e21bd2b53..."
],
コマンドを表示するCmd
にはRailsサーバコマンドの記載はありませんね。
これで無事変更が反映されていることが確認できました。
まとめ
今回はRailsのサーバが起動しないエラーに対応するために、起動コマンドを
「A server is already running. Check /tmp/pids/server.pid」のエラーの原因は「server.pid」ファイルがちゃんと削除されていないことが原因だったんですね。
削除すればRailsもちゃんと動いてくれるのか。
勉強になりました。(筆者が)
次回は?
ここまでビルドコマンドを何度も実行してきたのでDockerイメージが溜まり出していると思います。
そこで使用していないDockerイメージを削除する方法について学びましょう。
それでは、↓下の記事リストに続きがありますのでそのままお進みください。