次の記事などで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 /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.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