LoginSignup
8

More than 3 years have passed since last update.

Rails x Docker環境にテストDBを構築する

Last updated at Posted at 2019-06-25

Docker上でRailsアプリを開発するにあたり、テスト用のDBと開発用DBをそれぞれ構築する必要があったのでそのときの構築手順を記載。

前提

以下のようなDockerファイルでRailsアプリケーションを構築しているとする。

Dockerfile
FROM ruby:2.6
RUN apt-get update -qq && apt-get install -y nodejs
RUN mkdir /myapp
WORKDIR /myapp
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
RUN bundle install

COPY . /myapp

# Start the main process.
CMD ["rails", "server", "-b", "0.0.0.0"]

RailsアプリケーションのDB設定を以下のようになっているとする。

database.yml
default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: <%= ENV.fetch('DB_USERNAME', 'root') %>
  password: <%= ENV.fetch('DB_PASSWORD', 'pass') %>

development:
  <<: *default
  host: db
  database: myapp_development

test:
  <<: *default
  host: test-db
  database: myapp_test

production:
  <<: *default
  database: myapp_production

Dockerの設定方法

DBのコンテナ名はdatabase.ymlで設定したhostと一緒にする。

今回の場合、開発用DBのdockerコンテナは'db', テスト用DBのdockerコンテナは'test-db'とする。

MYSQL_USERとMYSQL_PASSWORDはdatabase.ymlで設定したユーザー名とパスワードと一致させる必要がある。

MYSQL_ROOT_PASSWORDはroot用パスワード。設定が必須。

MYSQL_DATABASEはdatabase.ymlで設定したdatabaseと一緒にする。

docker-compose.yml
version: '3'
services:
  web:
    build: .
    env_file: development.env
    ports:
      - '3001:3000'
    volumes:
      - .:/myapp
    depends_on:
      - db
      - test-db
  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: 'pass'
      MYSQL_USER: 'webapp'
      MYSQL_PASSWORD: 'test'
      MYSQL_DATABASE: myapp_development
    ports:
      - '3306:3306'

  test-db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: 'pass'
      MYSQL_USER: 'webapp'
      MYSQL_PASSWORD: 'test'
      MYSQL_DATABASE: myapp_test
    ports:
      - '3307:3306' # ローカルPCから接続するために設定

docker-compose.ymlに直接記述してもいいけど、環境変数は外出ししておく。
今回は、webappというユーザーがtestというパスワードでDBに接続できるような設定にする。↓

development.env
DB_USERNAME=webapp
DB_PASSWORD=test

接続確認

webのコンテナ名がdocker-rails_web_1という名前で立ち上がっている前提。

$ docker exec -it $(docker ps -f name=docker-rails_web_1 -q) /bin/bash

[docker] # rails c -e test
irb(main):001:0> ENV['RAILS_ENV']
=> "test"

[docker] # rails c
irb(main):001:0> ENV['RAILS_ENV']
=> "development"

さいごに

今回は環境ごとにDBコンテナを用意することでテストDBを構築しました。
そのほかには/docker-entrypoint-initdb.d配下にスクリプトを配置するという方法もあります。

詳しくは【Docker】Railsで理解する、複数のMySQLデータベースに一般ユーザーで接続するための環境構築手順で紹介していますのでご興味のある方はご覧になっていただければと思います。

ツイッター(@nishina555)やってます。フォローしてもらえるとうれしいです!

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
What you can do with signing up
8