Rails6で開発中のアプリの開発環境にdockerを導入しました。なんとか無事に動かすことができたのですが、MySQLの環境変数を設定している部分が理解できていません。なので詳しい方説明していただけませんでしょうか!
##MySQLのenvironment記述のルールがわからない
わからないことは具体的には以下の点です。
・どのような場合にどの環境変数を設定しなければいけないのか
・自分のdocker-compose.yml
がなぜ下記のような記述の仕方でないと動かないのか
いろいろな方のQiitaの記事を参考にdocker-compose.yml
を書いたのですが、大体の方は以下のような記述をしています。 (値は適当です。)
services: db: . . . environment: MYSQL_DATABASE: 'app_development' MYSQL_ROOT_PASSWORD: 'password' MYSQL_USER: 'appuser' MYSQL_PASSWORD: 'dev_password' web: . . .
もしくはMYSQL_ROOT_PASSWORD
だけや、それに加えてMYSQL_DATABASE
だけしか設定していなかったりなど皆さんまちまちです。(MYSQL_ROOT_PASSWORD
だけは必須であることは把握しています。)
一方私の場合は以下のように記述しないと正しく動きません。
version: '3' services: db: image: mysql:8.0.22 ports: - '3306:3306' volumes: - mysql_data:/var/lib/mysql # データの永続化 command: --default-authentication-plugin=mysql_native_password # 認証方式を8系以前のものにする。 environment: MYSQL_ROOT_PASSWORD: 'password' web: build: . # Dockerfile のあるディレクトリのパスを指定 command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'" ports: - '3000:3000' # localhostの3000ポートでアクセスできるようにする volumes: - .:/app # アプリケーションファイルの同期 depends_on: - db - test environment: MYSQL_DATABASE: 'app_development' MYSQL_USER: 'app-user' MYSQL_HOST: db stdin_open: true tty: true volumes: mysql_data: driver: local
ちなみにdatabase.yml
はこのようになっています。
default: &default adapter: mysql2 encoding: utf8mb4 pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> username: 'appuser' password: 'password' host: db development: <<: *default database: app_development host: <%= ENV.fetch("MYSQL_HOST") { 'localhost' } %> test: <<: *default database: app_test host: <%= ENV.fetch("MYSQL_HOST") { 'localhost' } %>
いろいろと試行錯誤してなんとか上記の記述に辿り着き今開発環境は動いているのですが、Rspecでテストを回そうとしてテスト環境のdbがうまく設定できずに苦戦しています。
なのでdockerでの正しいmysqlの設定の仕方を理解し、自分で考えて設定できるようになりたいです。