速度面とかコンソールの入りやすさとかデバッグのしやすさとか、個人的には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
で一気に起動できるようにした。