【備忘録】Rails+MySQLの環境構築をDockerでおこなう


前提

ローカル環境

  • macOS Mojave10.14.6
  • Docker for mac 2.2.0.5

バージョン

  • Ruby...2.6.3
  • Rails...5.2.4.1
  • alpine

その他

プロジェクト用ディレクトリを用意

$ mkdir myapp
$ cd myapp

ファイル作成

$ touch docker-compose.yml Dockerfile Gemfile Gemfile.lock

各ファイルを編集

  • .env.example
DB_NAME=myapp
DB_TEST_NAME=myapp_test
DB_USER=admin
DB_PASS=admin
DB_ROOT_PASS=password
TZ=Asia/Tokyo
  • docker-compose.yml
version: "3"
services:
  app:
    build: .
    volumes: 
      - .:/var/www/myapp
    command: rails s -p 8000 -b '0.0.0.0'
    ports: 
      - 13000:8000
    links: 
      - db
      - db-test

  db:
    image: mysql:5.7
    environment:
      - MYSQL_DATABASE=${DB_NAME}
      - MYSQL_USER=${DB_USER}
      - MYSQL_PASSWORD=${DB_PASS}
      - MYSQL_ROOT_PASSWORD=${DB_ROOT_PASS}
      - TZ=${TZ}
    ports: 
      - 23306:3306

  db-test:
    image: mysql:5.7
    environment:
      - MYSQL_DATABASE=${DB_TEST_NAME}
      - MYSQL_USER=${DB_USER}
      - MYSQL_PASSWORD=${DB_PASS}
      - MYSQL_ROOT_PASSWORD=${DB_ROOT_PASS}
      - TZ=${TZ}
    ports: 
      - 33306:3306
  • Dockerfile
FROM ruby:2.6.3-alpine3.10

RUN apk --update --no-cache add git \
  tzdata \
  libxml2-dev \
  curl-dev \
  make \
  gcc \
  libc-dev \
  g++ \
  mariadb-dev \
  linux-headers \
  nodejs

ENV APP_ROOT /var/www/myapp

WORKDIR $APP_ROOT

COPY ./Gemfile $APP_ROOT/Gemfile
COPY ./Gemfile.lock $APP_ROOT/Gemfile.lock

RUN bundle install && \
    apk update

COPY . $APP_ROOT
RUN rm -rf /usr/local/bundle/cache/* ${APP_ROOT}/vendor/bundle/cache/*
  • Gemfile
source 'https://rubygems.org'
gem 'rails', '5.2.2'

.env.exampleをコピーして.env作成

$ cp .env.example .env
// コピー後、値をPJに応じて変更

アプリケーション作成

$ docker-compose run app rails new . --force --no-deps --database=mysql --skip-bundle
  • ディレクトリが下記のようにできていれば成功
$ tree -L 1 .
.
├── Dockerfile
├── Gemfile
├── Gemfile.lock
├── README.md
├── Rakefile
├── app
├── bin
├── config
├── config.ru
├── db
├── docker-compose.yml
├── lib
├── log
├── package.json
├── public
├── storage
├── test
├── tmp
└── vendor

config/database.ymlを編集

$ vi config/database.yml

default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: admin   # docker-compose.ymlの設定と合わせる
  password: admin   # docker-compose.ymlの設定と合わせる
  host: db   # docker-compose.ymlのサービス名と合わせる

development:
  <<: *default
  database: myapp   # docker-compose.ymlの設定と合わせる
  host: db   # docker-compose.ymlの設定と合わせる

(中略)
test:
  <<: *default
  database: myapp_test   # docker-compose.ymlの設定と合わせる
  host: db-test   # docker-compose.ymlの設定と合わせる

(中略)

production:
  <<: *default
  database: myapp_production
  username: admin   # docker-compose.ymlの設定と合わせる
  password: <%= ENV['TESTAPP_DATABASE_PASSWORD'] %>

docker-compose

$ docker-compose build
$ docker-compose up -d
$ docker-compose exec app ash
$ rails -v   // バージョンが表示されれば成功
$ rails db:create

画面確認

  • localhost:13000にアクセスし、TOP画面が表示されれば成功