Ruby 3.1 + Rails 7 + MySQL 8 + Docker で環境構築する方法を紹介します
1. 5つのファイルを作成する
用意するファイル
- Dockerfile
- docker-compose.yml
- entrypoint.sh
- Gemfile
- Gemfile.lock
Dockerfile
FROM ruby:3.1
ARG RUBYGEMS_VERSION=3.3.20
RUN mkdir /rails_practice
WORKDIR /rails_practice
COPY Gemfile /rails_practice/Gemfile
COPY Gemfile.lock /rails_practice/Gemfile.lock
RUN bundle install
COPY . /rails_practice
COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000
CMD ["rails", "server", "-b", "0.0.0.0"]
docker-compose.yml
version: '3'
services:
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: password
ports:
- '3306:3306'
command: --default-authentication-plugin=mysql_native_password
volumes:
- mysql-data:/var/lib/mysql
web:
build: .
command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
volumes:
- .:/rails_practice
ports:
- "3000:3000"
depends_on:
- db
stdin_open: true
tty: true
volumes:
mysql-data:
driver: local
以前のバージョンの MySQL ではデフォルトで使用していた認証プラグインがmysql_native_password でしたが、 MySQL 8.0 以降は caching_sha2_password に変更となりました。
今回はmysql_native_passwordを使用しています。
(Railsはcaching_sha2_password未対応?)
entrypoint.sh
#!/bin/bash
set -e
rm -f /docker_rails/tmp/pids/server.pid
exec "$@"
Gemfile
source 'https://rubygems.org'
gem 'rails', '~>7.0.4'
Gemfile.lockという空ファイルを作ります
touch Gemfile.lock
2. Rails アプリケーション新規作成
docker-compose run web rails new . --force --no-deps --database=mysql --skip-test --webpacker
docker-compose build
3. データベース接続
database.yml
default: &default
adapter: mysql2
encoding: utf8mb4
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
username: <%= ENV.fetch("MYSQL_USERNAME", "root") %>
password: <%= ENV.fetch("MYSQL_PASSWORD", "password") %>
host: <%= ENV.fetch("MYSQL_HOST", "db") %>
development:
<<: *default
database: rails_practice_development
docker-compose run web rake db:create
4. 実行
docker-compose up
PS. 失敗してリセットする魔法
作成したdockerコンテナをすべて削除する
docker-compose down --rmi all --volumes --remove-orphans