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-recommends
や rm -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
でファイル共有しているため、ホスト側でソースコードを書き換えると自動的に反映される。