"Quickstart: Compose and Rails"を読みながらDocker ComposeでRails+MySQLの環境を作る
次の記事などでDockerを使ってRailsの開発環境を構築しているのを見て、自分でもやっておこうと思ったので、やってみました。

公式ドキュメントの”Quickstart: Compose and Rails”を読みながらやります。
前提
まったく同じ手順でやるだけというのもなんなので、一度おなじ手順でやったあとに、次のような変更を加えてやってみました。
- Rubyのバージョンを2.3.3から2.4.1にする
- Railsのバージョンを5.0.0.1から5.1.1にする
- PostgreSQLのかわりにMySQLを使う
以降の記述でとくに言及していないファイルや手順は”Quickstart: Compose and Rails”での説明とおなじことをやっています。
DockerとDocker Composeは次のバージョンを使います。
- Docker
- 17.03.1-ce
- Docker Compose
- 1.11.2
作業
Dockerfile
Railsの環境を含むイメージを作るためにDockerfileを書きます。
FROM ruby:2.4.1
RUN apt-get update -qq && apt-get install -y build-essential libmysqlclient-dev nodejs
RUN mkdir /myappWORKDIR /myapp
ADD Gemfile /myapp/GemfileADD Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
ADD . /myappRuby 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: - db2017年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.ymlのpasswordにdocker-compose.ymlで環境変数に指定したパスワードを書いておきます。実際はパスワードも環境変数などの間接的な方法で管理することになるでしょう。hostはdocker-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