Help us understand the problem. What is going on with this article?

【Rails】Rails 6.0 x Docker x MySQLで環境構築

はじめに

Rails 6.0 x Docker で環境構築しようとしたら思いのほか手こずったので、メモとして投稿します。
勉強中の初学者による記事です。誤りがあればご指摘いただければ嬉しいです!

各種バージョン

下記のバージョンにて動作確認しています。

  • macOS Mojave 10.14.6
  • Ruby 2.6
  • Rails 6.0.0
  • Docker 19.03.1
  • docker-compose 1.24.1
  • MySQL 8.0

手順

公式ドキュメントに従い、下記の流れで構築していきます。
なお、ドキュメント内では rails 5 系で進めているため、適宜 rails 6 系に読み替えます。

  1. 各種ファイルの用意
  2. rails new でアプリ作成
  3. イメージのビルド
  4. database.yml の設定と DB 接続
  5. コンテナ起動

一つずつ詳しくみていきます。

1. 各種ファイルの用意

任意のディレクトリを作成し、その配下に
Dockerfile
docker-compose.yml
Gemfile
Gemfile.lock
entrypoint.shを作成します。

$ mkdir myapp
$ cd myapp

各ファイルの中身は以下のような感じです。

Dockerfile

Dockerfile
FROM ruby:2.6
RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \
    && echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list \
    && apt-get update -qq \
    && apt-get install -y nodejs yarn \
    && mkdir /myapp
WORKDIR /myapp
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
COPY . /myapp

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"]
  • rails 6.0 からデフォルトJavaScriptコンパイラが webpackerに変更されました。参考:Rails ガイド
  • webpacker の導入に必要なパッケージマネージャーyarnをインストールするために、yarn公式サイトを参考に RUN コマンドを記述しています。

docker-compose.yml

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:
      - .:/myapp
    ports:
      - "3000:3000"
    depends_on:
      - db
    stdin_open: true
    tty: true
    command: bundle exec rails server -b 0.0.0.0
volumes:
  mysql-data:
    driver: local
  • MySQL8.0からセキュリティが強化されたようで、--default-authentication-plugin=mysql_native_password を実行して認証方式を mysql_native_password へ変更する必要があります。(詳しくはわかってません。。。)
    参考:MySQLリリースノート
    参考:Qiita記事

Gemfile

Gemfile
source 'https://rubygems.org'
gem 'rails', '~>6'

Gemfile.lock

# 何も記述しない空ファイルのままでOK

entrypoint.sh

entrypoint.sh
#!/bin/bash
set -e

# Remove a potentially pre-existing server.pid for Rails.
rm -f /myapp/tmp/pids/server.pid

# Then exec the container's main process (what's set as CMD in the Dockerfile).
exec "$@"

2. rails new でアプリ作成

5つのファイルが用意できたら、ターミナルから下記コマンドを実行します。

$ docker-compose run web rails new . --force --no-deps --database=mysql --skip-test --webpacker
  • あとで RSpec を導入するために--skip-test オプションで Minitest をスキップしています。
  • --webpacker オプションで webpacker をインストールします。

3. イメージのビルド

rails new で各種ファイルの作成、webpacker のインストールが完了したら、Gemfile が更新されているので、イメージをビルドします。

$ docker-compose build

4. database.yml の設定と DB 接続

rails new で作成された config/database.yml を編集します。

config/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: myapp_development

test:
  <<: *default
  database: myapp_test

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

データベースを作成します。

$ docker-compose run web rake db:create

5. コンテナ起動

下記コマンドでコンテナを起動します。

$ docker-compose up

localhost:3000 にアクセスすると例のページが表示されます。

Ruby_on_Rails.png

最後に

これで無事に環境構築完了です。
Dockerfile とかもっと良い書き方があるかもしれないけど、とりあえずは動いてるから良しとします。

参考

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away