Rails+Docker+puma+nginx+MySQLで開発をしていたときのことです。通常、開発環境やテスト環境のログは、log/development.log
やlog/test.log
に表示されるのですが、なぜかログが表示されず、空のままという現象が起こりました。
ログが見れないというのは致命的です!!
至急解決したかったのですが、ググって調べても意外と情報がでてこず、かなり時間を費やしてしまったので、私の二の舞を防ぐためにも、ここで共有させて頂きたいと思います。
また、RSpecのシステムスペックだと、テスト失敗時にtmp/screenshots
に自動でスクリーンショットが保存されるのですが、それも表示されないといった状況でしたが、これも同じ解決方法で解決することができました。
解決方法
非常に簡単です。
docker-compose.ymlの設定を変更するだけです。
変更前に使用していたdocker-compose.yml
version: '3'
services:
app:
build:
context: .
env_file:
- ./environments/db.env
command: bundle exec puma -C config/puma.rb
volumes:
- .:/webapp
- public-data:/webapp/public
- tmp-data:/webapp/tmp
- log-data:/webapp/log
depends_on:
- db
db:
image: mysql:5.7
env_file:
- ./environments/db.env
volumes:
- db-data:/var/lib/mysql
web:
build:
context: containers/nginx
volumes:
- public-data:/webapp/public
- tmp-data:/webapp/tmp
ports:
- 80:80
depends_on:
- app
volumes:
public-data:
tmp-data:
log-data:
db-data:
変更後のdocker-compose.yml
version: '3'
services:
app:
build:
context: .
command: bundle exec puma -C config/puma.rb
volumes:
- .:/webapp
- public-data:/webapp/public
- tmp-data:/webapp/tmp/sockets
- log-data:/var/log/nginx # 変更
depends_on:
- db
-
db:
image: mysql:5.7
volumes:
- db-data:/var/lib/mysql
web:
build:
context: containers/nginx
volumes:
- tmp-data:/webapp/tmp/sockets
- public-data:/webapp/public
ports:
- 80:80
depends_on:
- app
volumes:
db-data:
tmp-data:
driver: local # 追加
public-data:
log-data:
driver: local # 追加
log-data
のマウント先を/var/log/nginx
変更し、tmp-data
、log-data
にdriver: local
を記述します。
このように記述を変更したら、ログもスクリーンショットも表示されるようになりました。
driverでは、「ボリューム・ドライバがどのボリュームを使うべきか」を指定することができます。
指定先をlocalとすると文字通りホスト上のローカルのファイルシステムにボリュームが作成されます。
(ちなみに、ファイルシステムというのは、記憶装置に保存されたデータを管理したり、操作するために必要な機能で、これはOSによって提供されている機能です。)
しかし、ドキュメントを見るとデフォルトでlocalになっているようなので、記述する必要はなさそうに思えます。が、事実としてこれを明示的に記述しないとログは表示されませんでした。
このあたりのことがわかるかたがいましたら是非コメントいただけますと嬉しいです
参考: https://docs.docker.jp/compose/compose-file.html?highlight=compose#driver
最後まで読んでいただきありがとうございます!
学んだことを日々アウトプットしております!ご指摘などございましたら、是非コメントいただけますと嬉しいです!