大人気 Docker を使ってのアプリケーション開発が活発化している(根拠なし)今日このごろ、実務で使っていても 実のところ細かいことについては一切何もわかっていない という体たらくに終止符を打つべくして、 Rails の開発環境を定義してみよう、というのが本日の題である。
先ずはとりあえず実行したい
ということで正しい経路かどうかはわからんが、 Docker のドキュメント あたりを読み進めていく。重要そうなことが書いてある気がするのを全力で読み飛ばしつつ、まずは取り敢えず対話側での実行をしたい。
docker run -it ruby:2.6.6 bin/bash
2.6.6-alpine 使いたかったけど Rails のインストール時にコンパイルエラー食らったから一旦諦める
オプションについては
-
-t
: コンテナの中に擬似ターミナル(pseudo-tty)を割り当てる -
-i
: コンテナの標準出力(STDIN)を取得する
ということらしく、つまり この指定がないと対話型で使うことはできん ようだ。
Rails のアプリを発生させるぞ
コンテナに入ってさえしまえば、あとは単に rails new
をするだけなので
gem install rails -v 6.0.3
rails new myapp
このままだと Node.js not installed.
のエラーが出てたりとか、細かくは色々あるようだが、何にせよこれで開発に使えるアプリケーションソースが出来る… 訳がない のである。
ホスト側にファイルを置きたいんだけど
知っての通り(?)、コンテナ内のファイルはそのコンテナ内にあるものであって、そのままではホスト側から識別可能なものにならないため、開発に着手するには更に一手必要になる。
これの実現には Docker Volume の活用が必要で、コンテナの作成時に -v
のオプションを与えると良いらしい。
# まぁ「今いるところ」なら pwd でいいかなというアレ
docker run -it -v `pwd`:/webapp ruby:2.6.6 bin/bash
これにより、ホスト側のカレントディレクトリがコンテナ側の /webapp ディレクトリにマウントされる(= ファイルを突っ込んだ場合はホスト側に配置される)ようになる。ホスト側の任意のディレクトリをマウントしたい場合は 左側も絶対パス指定じゃないと駄目 らしい点には留意が要る。 相対パスでも構わん、と書いてあるのは多分これ別の文脈の説明だな?
さておき、この状況であれば /webapp にさえ配置してやれば rails new
の生成物がホスト側でも確認できるので、
rails new webapp/myapp
とすることで、手元に直接的に Ruby の実行環境を持っていなくても Rails のアプリケーションが作れる。
ひとまずはここまで。実用的な開発環境の定義には Dockerfile や docker-compose の活用が前提だと思うので、遠からずそちらも書き散らしていくとしたい。