Railsはローカルで動かしたいけどDBはDockerに載せたい

速度面とかコンソールの入りやすさとかデバッグのしやすさとか、個人的にはRailsはローカルで動かしながら開発したい。けどMySQLとかバージョンでローカル環境壊れたり、SidekiqとRedisローカルで動かすの辛かったりするのでその辺はDockerにあげたい。そんな気持ちがある。

compose.yamlを用意する

services: some-rails-api-db: platform: linux/x86_64 image: mysql:8.0 environment: MYSQL_ALLOW_EMPTY_PASSWORD: 'yes' TZ: 'Asia/Tokyo' ports: - '3306:3306' volumes: - some-rails-api-db-data:/var/lib/mysql volumes: some-rails-api-db-data:

特段特別なことはしない。

  • MySQL 8.0
  • ホストの3306にバインドする
  • ボリュームは永続化する

Rails側設定

ローカルでMySQLサーバーは立てないが、接続しに行くのにmysql2 gemは必要なので、mysql本体も必要にはなる。

$ brew install mysql@8.0 $ brew link --force mysql@8.0

今気付いたけど mysql-client だけでいいのかもしれない。試してない。

また、database.ymlを少しいじる必要がある。

default: &default adapter: mysql2 encoding: utf8mb4 pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> username: root password: - host: localhost + host: 127.0.0.1 + port: 3306

port はデフォルトでよしなに指定してくれそうだが念の為指定。問題はhostの値で、localhostだと強制的にsocket通信させられるため、127.0.0.1を指定することでtcp通信させている。

これで完成。

おまけ:Makefile

dev: compose/up bundle exec rails s compose/up: docker compose up -d

make dev で一気に起動できるようにした。

参考