コード日進月歩

しんくうの技術的な小話、メモ、つれづれ、など

Dockerを使って手元の環境にRubyやRailsを入れずにrails newした結果を手に入れる

パーフェクトRails読んでたら「まずはDockerイメージを作成する前に、サンプル用のRails アプリケーションを作成しましょう」と出てきたので、それすらも俺はDocker出やりたいんだ!と思ったので頑張ってみた

前提

dockerは使えるが、ローカルのrubyのバージョンやgemが操作できない(いじりたくない)状態のMac

手順

  1. dockerでrails newをするコンテナをbuildする
  2. 1でbuildしたコンテナを立ち上げる
  3. 立ち上げたコンテナからファイルをコピーする

1. dockerでrails newをするコンテナをbuildする

以下のようなDockerfileを作る

ARG ruby_version
ARG rails_version
FROM ruby:${ruby_version}

# nodejsをインストール
RUN curl -LO https://nodejs.org/dist/v12.18.3/node-v12.18.3-linux-x64.tar.xz
RUN tar xvf node-v12.18.3-linux-x64.tar.xz
RUN mv node-v12.18.3-linux-x64 node
ENV PATH /node/bin:$PATH


# yarnをセットアップする
# 公式ドキュメントまま https://classic.yarnpkg.com/ja/docs/install/#alternatives-stable
RUN curl -o- -L https://yarnpkg.com/install.sh | bash
ENV PATH /root/.yarn/bin:/root/.config/yarn/global/node_modules/.bin:$PATH

RUN gem install rails -v "${rails_version}"

ARG rails_option
RUN rails new ${rails_option} rails_app

引数として以下の値を渡してbuildする

  • 使いたいRubyのバージョン
  • 使いたいRailsのバージョン
  • rails newのオプション

Rubyは2.6.2、Railsは6.0.1、オプション引数としてmysqlを使いたい場合は以下のように実行する。

後続の処理を完結にするためにrails_new というタグもつけておきたいので -t rails_new も設定する

 docker build . -t rails_new --build-arg ruby_version=2.6.3 --build-arg rails_version=6.0.1 --build-arg rails_option='--database=mysql'

2. 1でbuildしたコンテナを立ち上げる

これ普通通り行う、この際に出力されるIDを控える

$ docker run -d rails_new
33506da9526624ff6dbc3eff77a8b597ce26d9dba70c2fb3fb7b40f7bcc78942

3.立ち上げたコンテナからファイルをコピーする

立ち上がっているコンテナからは docker cp でファイルが取得できるので取得する。

docker cp 31506da9126667ff6bbc3e2f77a8b597ce26d9dba70c2fb3fb7b40f7bcc78942:rails_app ./

こうすれば rails_app というディレクトリがコピーされる。

参考リンク

参考図書