Docker上でRailsアプリを開発するにあたり、テスト用のDBと開発用DBをそれぞれ構築する必要があったのでそのときの構築手順を記載。
前提
以下のようなDockerファイルでRailsアプリケーションを構築しているとする。
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設定を以下のようになっているとする。
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と一緒にする。
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に接続できるような設定にする。↓
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)やってます。フォローしてもらえるとうれしいです!