🐳

dockerでプレーンなRails+MySQL実験環境を用意してみた

3 min read

なるべくプレーンなRails+MySQLをdocker-composeで用意しておいて、実験したい時にササッできる環境を用意しました。

TL;DR

以下に用意してあるので、欲しい方はコピーするなりforkするなりしてください。

https://github.com/te-nu/rails-mysql-plain-dev

手順

基本的にはdockerの公式ドキュメントに従いました。

https://docs.docker.jp/compose/rails.html

RubyとRailsのバージョンを変更し、DBはpostgreSQL→MySQLに変更しています。
RailsはAPIモードで実装をしています。

ファイル用意

まずDockerfileを準備します

FROM ruby:2.7.2
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs
RUN mkdir /myapp
WORKDIR /myapp
ADD Gemfile /myapp/Gemfile
ADD Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
ADD . /myapp

Gemfileを準備し、Gemfile.lockを用意します

source 'https://rubygems.org'
gem 'rails', '6.0.3.3'
$ touch Gemfile.lock

最後に取りまとめのdocker-compose.ymlを用意します。

services:
  db:
    image: mysql:8.0.21
    command: --default-authentication-plugin=mysql_native_password
    # ↑ MySQL8より前の認証方法をデフォルトに
    environment:
      MYSQL_ALLOW_EMPTY_PASSWORD: "yes"
  web:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/myapp
    ports:
      - "3000:3000"
    depends_on:
      - db

ローカルでしか使わない環境であるという理由からパスワードなしでMySQLにログインできるようにしています。

またMySQLは8からデフォルトの認証方法が変わっているため、従来のパスワードによる認証に変更をしています。

参考: https://hub.docker.com/_/mysql (How to use this imageの項より)

初期化

Railsの初期化用コマンドを走らせます(--apiでAPIモードで初期化しています、不要なら外せばOK)

docker-compose run web rails new . --force --database=mysql --api

色々インストールが走ったのちファイルが準備されます

$ ls
Dockerfile         Rakefile           config.ru          log                tmp
Gemfile            app                db                 public             vendor
Gemfile.lock       bin                docker-compose.yml storage
README.md          config             lib                test

Gemfileが更新されたため、imageをビルドし直します

docker-compose build

データベースの接続先を変更するためにconfig/database.ymlを編集します

default: &default
  adapter: mysql2
  encoding: utf8mb4
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password:
  host: db
  # ↑ここを変えた

development:
  <<: *default
  database: myapp_development

test:
  <<: *default
  database: myapp_test

production:
  <<: *default
  database: myapp_production
  username: myapp
  password: <%= ENV['MYAPP_DATABASE_PASSWORD'] %>

起動

バックグラウンドで立ち上げます。

$ docker-compose up -d

確認します。

$ docker-compose ps
           Name                          Command               State           Ports
---------------------------------------------------------------------------------------------
rails-mysql-plain-dev_db_1    docker-entrypoint.sh --def ...   Up      3306/tcp, 33060/tcp
rails-mysql-plain-dev_web_1   bundle exec rails s -p 300 ...   Up      0.0.0.0:3000->3000/tcp

このままだとMySQL内にdatabaseが作られていないので作成します。

$ docker-compose run --rm web rails db:create

これで完了です。 http://localhost:3000にアクセスして映ればOKです。

とりあえずササッと立ち上げて触れるRails環境の完成です。

DBの永続化もしていないため、コンテナを削除するたびにデータは初期化されます。ほしい方は別途volumeで永続化を図ってください。

参考