Tech Racho エンジニアの「?」を「!」に。
  • Ruby / Rails関連

Rails: サーバーのIPアドレスを環境変数で設定するにはHOSTではなくBINDINGを使う

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環境変数でも設定可能です。

関連記事

Rails 7 : rails newのフロントエンド関連オプションの組み合わせを調べてみた


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。