Rails環境をDockerで作る

Railsチュートリアルを始めた。せっかくなので環境をDockerで作ってみた。

これをかなり参考にさせてもらった RailsアプリをDockerで開発するための手順 - Qiita

Rails入りのDocker Imageを作る

RailsのDocker Imageは Docker Hubにある のだけど、なんかDEPRECATEDと書いてあるし、勉強も兼ねて自分でRails入りのイメージを作った。

RubyのイメージにRailsをインストールするために、次のDockerfileとGemfileを作成し、空の Gemfile.lock も作成した(内容は、参考にしたリンク先のものからバージョン番号を変えたくらいでほぼそのまま)。

Dockerfile:

FROM ruby:2.4.0

ENV APP_ROOT /usr/src/workspace

WORKDIR $APP_ROOT

RUN apt-get update && \
    apt-get install -y nodejs \
                       mysql-client \
                       postgresql-client \
                       sqlite3 \
                       --no-install-recommends && \
    rm -rf /var/lib/apt/lists/*

COPY Gemfile $APP_ROOT
COPY Gemfile.lock $APP_ROOT

RUN \
  echo 'gem: --no-document' >> ~/.gemrc && \
  cp ~/.gemrc /etc/gemrc && \
  chmod uog+r /etc/gemrc && \
  bundle config --global build.nokogiri --use-system-libraries && \
  bundle config --global jobs 4 && \
  bundle install && \
  rm -rf ~/.gem

Gemfile:

source "https://rubygems.org"
gem 'rails', '5.0.1'

ここからdocker buildしてRailsが入ったイメージを作成する。

$ docker build -t tomerun/rails_5_0_1 .
(snip)
$ docker images
REPOSITORY                     TAG                 IMAGE ID            CREATED             SIZE
tomerun/rails_5_0_1            latest              afc9c9a9ef93        3 minutes ago      801 MB

apt-getするときの --no-install-recommendsrm -rf /var/lib/apt/lists/* は、ファイルサイズを削減するため。参照: http://d.hatena.ne.jp/mainyaa/20140203/p1 の10番

作成したイメージからアプリのひな形を作成

アプリケーションを作成するディレクトリへ移動し、上で使ったGemfileをコピーしてくる(これがないとrails newが失敗するのだけど、Railsの仕組みを理解していないのでなぜ必要なのかわかっていない)。 その後、Docker内で rails new してアプリケーションのひな形を作る。 途中でGemfileを上書きして良いか聞かれるので Y で進める。

$ mkdir app_dir
$ cd app_dir
$ cp ../rails_template/Gemfile .
$ docker run --rm -it -v "$PWD":/usr/src/workspace tomerun/rails_5_0_1 rails new . -BT
(snip)
$ ls
Gemfile       README.md     app/          config/       db/           log/          tmp/
Gemfile.lock  Rakefile      bin/          config.ru     lib/          public/       vendor/

ライブラリをインストールしたDocker Imageを作る

使用するgemをインストールしたイメージを作っていく。

まず、Gemfileを必要に応じて書き換える。

次のDockerfileを作って、更新したGemfileを元にbundle installを実行したdocker imageを作成する。

FROM tomerun/rails_5_0_1

ENV APP_ROOT /usr/src/workspace

WORKDIR $APP_ROOT

COPY Gemfile $APP_ROOT

RUN bundle install --without production

EXPOSE  3000
$ docker build -t tomerun/rails_toy_app .
(snip)
$ docker images
REPOSITORY                     TAG                 IMAGE ID            CREATED             SIZE
tomerun/rails_toy_app          latest              e5c44f8a1a2b        3 minutes ago       854 MB
tomerun/rails_5_0_1            latest              afc9c9a9ef93        About an hour ago   801 MB

Gemfile.lockをイメージ内からホスト側へ持ってくるために適当なことをする

$ docker run -d tomerun/rails_toy_app sleep 100
$ docker cp 1ec8e208d405:/usr/src/workspace/Gemfile.lock .
# 1ec8e208d405 はコンテナID
$ docker stop 1ec8e208d405

次のようにするとRailsが起動する。localhost:3000 にアクセスすると動いている様子が見える。

$ docker run -d -p 3000:3000 -v "$PWD":/usr/src/workspace tomerun/rails_toy_app rails server -b 0.0.0.0

-v でファイル共有しているため、ホスト側でソースコードを書き換えると自動的に反映される。