Kōhei Yamamoto

"Quickstart: Compose and Rails"を読みながらDocker ComposeでRails+MySQLの環境を作る

次の記事などでDockerを使ってRailsの開発環境を構築しているのを見て、自分でもやっておこうと思ったので、やってみました。

公式ドキュメントの”Quickstart: Compose and Rails”を読みながらやります。

前提

まったく同じ手順でやるだけというのもなんなので、一度おなじ手順でやったあとに、次のような変更を加えてやってみました。

以降の記述でとくに言及していないファイルや手順は”Quickstart: Compose and Rails”での説明とおなじことをやっています。

DockerとDocker Composeは次のバージョンを使います。

作業

Dockerfile

Railsの環境を含むイメージを作るためにDockerfileを書きます。

FROM ruby:2.4.1
RUN apt-get update -qq && apt-get install -y build-essential libmysqlclient-dev nodejs
RUN mkdir /myapp
WORKDIR /myapp
ADD Gemfile /myapp/Gemfile
ADD Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
ADD . /myapp

Ruby 2.4.1の公式イメージがあるので、タグ2.4.1を指定します。Rubyのイメージの大元はDebianのイメージなので、apt-getで必要なパッケージをインストールしていきます。

RubyのMySQLクライアントであるmysql2というgemがlibmysqlclient-devというライブラリに依存するので、このライブラリをインストールしておきます。

Gemfile

さきほどのDockerfileでイメージへコピーしていたGemfileは、Railsの5.1.1を使うことから次のような内容とします。

source 'https://rubygems.org'
gem 'rails', '5.1.1'

docker-compose.yml

複数のコンテナをDocker Composeで立ち上げるためにComposeファイルdocker-compose.ymlを書きます。

version: '3'
services:
db:
image: mysql
environment:
MYSQL_ROOT_PASSWORD: password
web:
build: .
command: bundle exec rails s -p 3000 -b '0.0.0.0'
volumes:
- .:/myapp
ports:
- "3000:3000"
depends_on:
- db

2017年5月現在、Composeファイルはバージョン3が最新版かつ推奨1なので、version: 3を指定しておけばよさそうです。

MySQLを使うとき、環境変数にMYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD, MYSQL_RANDOM_ROOT_PASSWORDのどれかを指定する必要があります。詳しくはMySQL公式イメージのページにある”Environment Variables”の節を参照してください。今回はMYSQL_ROOT_PASSWORDでrootパスワードを指定しておきます。

イメージのビルド

手順どおりやればOKです。イメージビルド後にRailsプロジェクトを作成するときMySQLを使う設定ファイルを生成するために、オプション--databaseを指定しておきます。

$ docker-compose run web rails new . --force --database=mysql --skip-bundle

データベースへの接続設定

config/database.ymlpassworddocker-compose.ymlで環境変数に指定したパスワードを書いておきます。実際はパスワードも環境変数などの間接的な方法で管理することになるでしょう。hostdocker-compose.yml内で指定したDB用コンテナの名前dbを指定します。

default: &default
adapter: mysql2
encoding: utf8
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
username: root
password: password
host: db
development:
<<: *default
database: myapp_development
test:
<<: *default
database: myapp_test

はじめはDBがないので作る必要があります。Rails 5ではrailsコマンドでタスクを実行できます。

$ docker-compose run web bin/rails db:create

コンテナの起動

最後に次のコマンドでweb, dbのコンテナを立ち上げて、ブラウザでlocalhost:3000にアクセスすればRailsのデフォルトページが見られます。

$ docker-compose up

脚注

  1. https://docs.docker.com/compose/compose-file/compose-versioning/