332
326

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-09-13

はじめに

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
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 とかもっと良い書き方があるかもしれないけど、とりあえずは動いてるから良しとします。

参考

332
326
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
332
326

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?