以前、Rails7 + PostgreSQLの環境構築をしました。
今回は、MySQLを使ったRails7の環境構築をしてみます。 本記事ではビルドにimportmapを使用した場合の環境構築を行なっていきます。
esbuildを使用する場合は こちらの記事 を読み替えながら こちらのボイラープレートを参考にしてみてください。
1. ファイルを準備する
まず始めに、以下の3つのファイルを作成します。
- Dockerfile.dev
- docker-compose.yml
- docker-entrypoint-initdb.d/grant_privileges_to_user.sql
次に、各ファイルの中身を以下のようにしていきます。
Dockerfile.dev
FROM ruby:3.3.0-alpine RUN apk add --no-cache git build-base libxml2-dev libxslt-dev mysql-dev mysql-client tzdata bash vim && \ cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime ENV APP_ROOT /app RUN mkdir $APP_ROOT WORKDIR $APP_ROOT ENV LANG=ja_JP.UTF-8 \ BUNDLE_JOBS=4 \ BUNDLE_RETRY=3 \ EDITOR=vim RUN gem update --system && \ gem install --no-document bundler:2.5.7 RUN bundle config set force_ruby_platform true
docker-compose.yml
version: '3' services: app: build: context: . dockerfile: "Dockerfile.dev" stdin_open: true tty: true ports: - 3000:3000 command: /bin/sh -c "bundle install && rm -f tmp/pids/server.pid && bin/rails s -b 0.0.0.0 -p 3000" environment: DB_USER: mysql DB_PASS: mysql DB_HOST: mysql depends_on: - mysql volumes: - .:/app:delegated - bundle-data:/usr/local/bundle:delegated mysql: image: mysql:8.3 stdin_open: true tty: true restart: always ports: - 3306:3306 environment: MYSQL_RANDOM_ROOT_PASSWORD: true MYSQL_USER: mysql MYSQL_PASSWORD: mysql TZ: Asia/Tokyo volumes: - ./docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d - mysql-data:/var/lib/mysql:cached volumes: mysql-data: bundle-data:
docker-entrypoint-initdb.d/grant_privileges_to_user.sql
GRANT ALL ON *.* TO 'mysql'@'%' ;
2. 環境構築をする
ファイルの準備ができたら、各種コマンドを実行していきます。
今回は、新規Railsプロジェクトを作成してみます。
1. docker compose build
を実行します。
2. docker compose run --rm app gem install rails
を実行します。
3. docker compose run --rm app rails new . -d mysql
を実行します。
4. config/database.yml
の default
内を以下のように編集します。
username: <%= ENV['DB_USER'] %> password: <%= ENV['DB_PASS'] %> host: <%= ENV['DB_HOST'] %>
5. docker compose up mysql -d
を実行します。
6. docker compose run --rm app rails db:create
を実行します。
エラーになる場合は、手順5の後に少し時間を置いてみてください。
7. docker compose stop mysql
を実行します。
8. docker compose up
を実行します。
9. http://localhost:3000/ にアクセスしてページが表示されれば完了です。
今回のポイント
ポイント1
MySQLのrootユーザーを使用せずに環境構築をする場合 MYSQL_USER
で指定したユーザーに権限が足りないため、DB作成などの操作ができません。
MySQLのコンテナ初回起動時に docker-entrypoint-initdb.d
配下のファイルが自動で実行されるので、ユーザーへ権限を付与するSQLを docker-entrypoint-initdb.d/grant_privileges_to_user.sql
に記載しています。
rootユーザーを使うのが一番早くて簡単だと思いますが、rootユーザーを使わない環境構築をしてみたかったので、今回挑戦してみました。
ポイント2
rootユーザーを使用しないとはいえ、rootユーザーのパスワードを設定しないとMySQLに怒られてしまいます。
そこで今回は、rootユーザーのパスワードを自動で生成するように MYSQL_RANDOM_ROOT_PASSWORD
というオプションを使用しました。
コンテナ初回起動時に自動でランダムなパスワードが生成されるので、パスワードを設定しないと怒られるということも無くなりました。
rootパスワードは、生成時に一度だけログに流れます。
パスワードを知っておきたい方は、コンテナをバックグランドで起動しないように気をつけましょう。
最後に
これでRails7の環境構築ができました!
ボイラープレートをGitHubで公開していますので是非ご活用ください!!