お題
ホスト環境のRubyを使わずにDocker上のRubyだけで、rails new
コマンドを使って、Ruby on Railsの環境を構築します。
環境
- fish-shell version 3.0.1
- Docker Desktop 2.1.0.3 (38240)
- ruby 2.6.5p114 (2019-10-01 revision 67812) [x86_64-linux-musl]
- Rails 6.0.0
手順
RubyのDockerイメージを取得
docker pull 2.6.5-alpine3.10
Gemfileを作る
docker run --rm -v (pwd):/usr/src/myapp -w /usr/src/myapp 2.6.5-alpine3.10 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 2.6.5-alpine3.10
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/ を開きます。
が開いたら成功です!