Rails 7でrails new
するときにアセットをビルドするオプションを渡すと、以下が作成されます。
- bin/dev
- このbinstubから以下のProcfile.devをforeman経由で呼び出す
- Procfile.dev
このProcfile.devは、rails new
で指定するオプションによって変わりますが、たとえば以下のようになります。
web: bin/rails server -p 3000
css: bin/rails tailwindcss:watch
このセッティングでbin/dev
を実行すると、サーバーがlistenするIPアドレスは127.0.0.1
になります。
しかし、bin/dev
をdocker-compose内で起動する場合は、サーバーがlistenするIPアドレスを0.0.0.0
にしないと手元のブラウザでアクセスできません。
$ dip dev
Creating rails701_ruby31_rails_run ... done
04:09:35 web.1 | started with pid 8
04:09:35 css.1 | started with pid 9
04:09:36 web.1 | => Booting Puma
04:09:36 web.1 | => Rails 7.0.1 application starting in development
04:09:36 web.1 | => Run `bin/rails server --help` for more startup options
04:09:37 web.1 | Puma starting in single mode...
04:09:37 web.1 | * Puma version: 5.5.2 (ruby 3.1.0-p0) ("Zawgyi")
04:09:37 web.1 | * Min threads: 5
04:09:37 web.1 | * Max threads: 5
04:09:37 web.1 | * Environment: development
04:09:37 web.1 | * PID: 8
04:09:37 web.1 | * Listening on http://127.0.0.1:3000 # これだとブラウザから見えない
04:09:37 web.1 | Use Ctrl-C to stop
04:09:38 css.1 |
04:09:38 css.1 | Rebuilding...
04:09:38 css.1 | Done in 497ms.
参考: Quickstart: Compose and Rails | Docker Documentation
普通に考えれば、Procfile.devに以下のように-b 0.0.0.0
を追加することでブラウザからアクセスできるようになります(実際できました)。想像ですが、bin/devを書き換えずにカスタマイズするためにProcfile.devがあるのかもしれません。
web: bin/rails server -p 3000 -b 0.0.0.0
css: bin/rails tailwindcss:watch
これでおしまいにしてもいいのですが、自分は0.0.0.0
をdocker-compose.ymlの環境変数で指定したかったので、そのあたりを調べてみました。
ホストアドレスはBINDING環境変数で設定する
調べてみると、現在のRailsでホストがlistenするIPを設定する環境変数はHOSTではありませんでした。
HOST環境変数はかつてRails 5.1で導入されていました↓。
しかしその後、HOST環境変数がSuSE Linuxでバッティングすることがわかり、HOSTを非推奨にしてBINDINGに変更することになりました。
その後、Rails 6.1でHOSTが削除されてBINDINGのみとなり、現在に至ります。
これがわかったので、docker-compose.ymlでBINDING=0.0.0.0
を指定することで、Procfile.devを書き換えずにbin/dev
を使えるようになりました。Procfile.devを使わないpropshaftや普通のアセットパイプラインのセットアップでも同様に0.0.0.0
が設定されます。
# docker-compose.yml(抜粋)
backend: &backend
<<: *app
stdin_open: true
tty: true
volumes:
- .:/app:cached
- rails_cache:/app/tmp/cache
- bundle:/bundle
- .dockerdev/.bashrc:/root/.bashrc:ro
- .dockerdev/.bashrc:/root/.irbrc:ro
- node_modules:/node_modules
environment:
- RUBY_YJIT_ENABLE=1
- NODE_ENV=development
- RAILS_ENV=${RAILS_ENV:-development}
- BINDING=0.0.0.0 # ここで設定
- BOOTSNAP_CACHE_DIR=/bundle/bootsnap
- WEB_CONCURRENCY=0
- HISTFILE=/app/log/.bash_history
- EDITOR=vi
runner:
<<: *backend
command: /bin/bash
ports:
- "3000:3000"
- "3002:3002"
rails:
<<: *backend
command: bin/dev
ports:
- "3000:3000"
$ dip dev
Creating rails701_ruby31_rails_run ... done
03:44:50 web.1 | started with pid 8
03:44:50 css.1 | started with pid 9
03:44:51 web.1 | => Booting Puma
03:44:51 web.1 | => Rails 7.0.1 application starting in development
03:44:51 web.1 | => Run `bin/rails server --help` for more startup options
03:44:51 web.1 | Puma starting in single mode...
03:44:51 web.1 | * Puma version: 5.5.2 (ruby 3.1.0-p0) ("Zawgyi")
03:44:51 web.1 | * Min threads: 5
03:44:51 web.1 | * Max threads: 5
03:44:51 web.1 | * Environment: development
03:44:51 web.1 | * PID: 8
03:44:51 web.1 | * Listening on http://0.0.0.0:3000 # これでブラウザからアクセスできる
03:44:51 web.1 | Use Ctrl-C to stop
03:44:53 css.1 |
03:44:53 css.1 | Rebuilding...
03:44:53 css.1 | Done in 536ms.
Procfile.devに既に-p
オプションがあるので今回は使いませんでしたが、listenするポート番号はPORT
環境変数でも設定可能です。