👱‍♂️

Rails6 + MySQLの開発環境をDockerで構築する

4 min read

何番煎じかはわかりませんが、Railsの開発環境をDockerで構築する手順を残します。

  • Rails 6.0.3.4
  • MySQL 8.0.20
  • Ruby 2.7.2

必要なファイル/ディレクトリを用意する

touch {Dockerfile,docker-compose.yml,Gemfile,Gemfile.lock,.env}
% tree -L 1
.
├── Dockerfile
├── Gemfile
├── Gemfile.lock
├── docker-compose.yml
Dockerfile
FROM ruby:2.7.2

ENV LANG C.UTF-8
ENV APP_ROOT /app

WORKDIR /app

RUN apt-get update \
  && 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 \
  && apt-get install -y sqlite3 \
  && apt-get install -y libsqlite3-dev \
  && apt-get install -y vim \
  && apt-get clean  \
# Capybaraでテストするために必要なものをインストール
# 署名を追加(chromeのインストールに必要) -> apt-getでchromeと依存ライブラリをインストール
  && wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add \
  && echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" | tee /etc/apt/sources.list.d/google-chrome.list \
  && apt-get update -qq \
  && apt-get install -y google-chrome-stable libnss3 libgconf-2-4 \
  && CHROMEDRIVER_VERSION=`curl -sS chromedriver.storage.googleapis.com/LATEST_RELEASE` \
  && curl -sS -o /tmp/chromedriver_linux64.zip http://chromedriver.storage.googleapis.com/$CHROMEDRIVER_VERSION/chromedriver_linux64.zip \
  && unzip /tmp/chromedriver_linux64.zip \
  && mv chromedriver /usr/local/bin/ \
# Ruby-2.7以降だと`gem install bundler`しないとエラーが発生する
  && gem install bundler

RUN mkdir -p $APP_ROOT
WORKDIR $APP_ROOT

COPY Gemfile $APP_ROOT/Gemfile
COPY Gemfile.lock $APP_ROOT/Gemfile.lock
RUN bundle update --bundler \
&& bundle install  --jobs 4 --retry 3
docker-compose.yml
version: '3'
services:
  db:
    image: mysql:8.0.20
    volumes:
      - ./tmp/db:/var/lib/mysql
    ports:
      - '3306:3306'
    command: --default-authentication-plugin=mysql_native_password
    env_file: .env

  web:
    build: .
    command: /bin/sh
    env_file: .env
    environment:
      WEBPACKER_DEV_SERVER_HOST: "0.0.0.0"
      RAILS_SERVE_STATIC_FILES: "1"
      EDITOR: "vim"
    volumes:
      - ./app:/app:cached
    ports:
      - "3000:3000"
    depends_on:
      - db
    tty: true
.env
MYSQL_ROOT_PASSWORD=password
TZ=Japan
Gemfile
source 'https://rubygems.org'
ruby '2.7.2'

gem 'rails', '6.0.3.4'
Gemfile.lock
# Gemfile.lockは空

イメージを作成する

1つ目のターミナルで以下のコマンドを実行します。

$ docker-compose build --no-cache
$ docker-compose up

Railsプロジェクトを作成する

別のターミナルで以下を実行します。

$ docker-compose exec web bash
/app# rails -v
Rails 6.0.3.4
/app# rails new . --force --database=mysql --skip-turbolinks --skip-test
/app# bin/rails webpacker:install
  • --skip-test: testを作成しない。--skip-test-unitと同じ
  • --force:ファイルが存在していても上書きする

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: app_development

test:
  <<: *default
  database: app_test

production:
  <<: *default
  database: app_production
  username: app
  password: <%= ENV['APP_DATABASE_PASSWORD'] %>

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

/app# bin/rails db:create
/app# bin/rails db:migrate

サーバを起動します。

/app# bin/rails s -b 0.0.0.0

ブラウザからhttp://localhost:3000/を開きます。

公式のやり方は下記を参照。

クィックスタート: Compose と Rails

RSpecのインストール

Gemfileにrspecとfactory_botのgemを加えます。

Gemfile
group :development, :test do
  # Call 'byebug' anywhere in the code to stop execution and get a debugger console
  gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
  gem 'rspec-rails'
  gem 'factory_bot_rails'
end

RailsアプリにRSpecを導入します。

/app# bundle exec rails g rspec:install
Running via Spring preloader in process 1096
      create  .rspec
      create  spec
      create  spec/spec_helper.rb
      create  spec/rails_helper.rb
GitHubで編集を提案

Discussion

ログインするとコメントできます