docker-compose up後に自動でwebコンテナがexitedになる

初めに

  • 学習中に生じたエラーについて解決方法のプロセスを記述していこうと思います。

問題

  • docker-compose up後にRailsサーバーが立ち上がるようにしたいが、立ち上がらない。

  • 原因としてはweb側のコンテナが勝手にExitedされているから。

logを確認してみる。

web-1  | => Booting Puma
web-1  | => Rails 7.0.6 application starting in development 
web-1  | => Run `bin/rails server --help` for more startup options
web-1  | Exiting
web-1  | A server is already running. Check /workdir/tmp/pids/server.pid.
web-1 exited with code 1
  • A server is already running. Check /workdir/tmp/pids/server.pid.の部分でまだ立ち上げていないのに、サーバーが立ち上がっていると表示されている。

原因

  • 以前に起動した時に作成されたserver.pidというファイルが残ってしまったため。

  • サーバ起動のたびにserver.pidの削除を行う。

解決方法

  1. rm tmp/pids/server.pidを実行する。

  2. 問題は解決するが、いちいちコマンドを実行しなければいけないので面倒である。

  3. docer-compose.ymlの修正を行う。

修正前

version: '12'
services:
  db:
    image: postgres
  web:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/workdir
    ports:
      - "3000:3000"
    depends_on:
      - db

修正後

version: '12'
services:
  db:
    image: postgres
  web:
    build: .
    command: /bin/sh -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - .:/workdir
    ports:
      - "3000:3000"
    depends_on:
      - db
  • これで次回起動してもrm tmp/pids/server.pidを実行しなくても良くなる。

結語

  • server.pidが作成されると次にサーバーを起動しても勝手にexitedされてしまう。

  • server.pidを削除することで解消される。

  • 毎回起動前にserver.pidを削除するのは手間なのでdocker-compose.ymlを修正する。