Ruby
MacOSX
fish
RubyOnRails
docker

ホスト環境のRubyを使わずにDockerを使ってRails newする

お題

ホスト環境のRubyを使わずにDocker上のRubyだけで、rails newコマンドを使って、Ruby on Railsの環境を構築します。

環境

  • fish-shell version 2.7.1
  • Docke for mac Version 18.03.1-ce-mac65 (24312)
  • Ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-linux-musl]
  • Rails 5.2.0

手順

RubyのDockerイメージを取得

docker pull ruby:2.5-alpine

Gemfileを作る

docker run --rm -v (pwd):/usr/src/myapp -w /usr/src/myapp ruby:2.5-alpine bundle init

Gemfile内のrailsの行のコメントアウトを外します。

# frozen_string_literal: true

source "https://rubygems.org"

git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }

gem "rails"

Dockerイメージを作る

Railsは依存ライブラリが多いのでDockerfileを作って、依存ライブラリ入りのイメージを作ります。
次の内容をDockerfileとして保存します。

FROM ruby:2.5-alpine

ENV BUILD_PACKAGES="curl-dev ruby-dev build-base" \
    DEV_PACKAGES="zlib-dev libxml2-dev libxslt-dev tzdata yaml-dev sqlite-dev" \
    RUBY_PACKAGES="ruby-json yaml"

# Update and install base packages and nokogiri gem that requires a
# native compilation
RUN apk update && \
    apk upgrade && \
    apk add --no-cache --update\
    $BUILD_PACKAGES \
    $DEV_PACKAGES \
    $RUBY_PACKAGES && \
    mkdir -p /usr/src/myapp

# Copy the app into the working directory. This assumes your Gemfile
# is in the root directory and includes your version of Rails that you
# want to run.
WORKDIR /usr/src/myapp
COPY Gemfile /usr/src/myapp
COPY Gemfile.lock /usr/src/myapp

RUN gem install bundler
RUN bundle config build.nokogiri --use-system-libraries && \
    bundle install --jobs=4 --retry=10 --clean

Gemfile.lockをコピーするので、空ファイルを用意します。

touch Gemfile.lock

dockerイメージを作成します。

docker build -t temp .

Railsをインストール

docker run --rm -v (pwd):/usr/src/myapp temp bundle

Rails new

docker run --rm -v (pwd):/usr/src/myapp temp rails

で、railsコマンドのオプションの説明が表示されます。
良さげなオプションを選択します。
ここでは-MCTBS --skip-yarn --skip-turbolinks --skip-bundle --apiを指定することにします。

docker run --rm -v (pwd):/usr/src/myapp temp rails new . -f -MCTBS --skip-yarn --skip-turbolinks --skip-bundle --api

起動確認

Gemfileを更新され、依存Gemが追加されたので、Dockerイメージを作り直します。

docker build -t temp .

Ruby on Railsを起動します。

docker run --rm -it -v (pwd):/usr/src/myapp -p 80:3000 temp bin/rails s -b 0.0.0.0

ブラウザで http://localhost/ を開きます。

スクリーンショット 2018-07-11 17.35.41.png

が開いたら成功です!