【Ruby on Rails】をVS CodeのRemote Containerで開発するための環境をつくった記録


ちょっと仕事の都合でRuby on Railsのアプリケーションに一瞬触れることがあり、いい機会だからちょっとRailsに慣れておくかと思い、環境づくりをせこせこやってみた記録。
Railsの専用イメージがあればもうちょっと手軽だったんだろうが、2022年2月現在で既に非推奨化してるので、しょうがないから自分で用意することにした。
個人的にVS CodeのRemote Containerで開発することが多いので、そのためのDockerイメージ作りという感じ。基本的には必要なものをインストールしまくるだけの簡素なもの。
後に同じことをしたくなったとき用に備忘録を兼ねてまとめる。


Dockerfile

FROM ruby:3.0.3-slim-bullseye  
  
RUN apt update && apt upgrade -y  
  
# install necessary libraries  
RUN apt install -y ruby-dev build-essential zlib1g-dev  
  
# install rails  
RUN gem install rails --no-document  
  
# install curl  
RUN apt install -y curl  
  
# install nodejs,npm,yarn  
RUN curl -fsSL https://deb.nodesource.com/setup_current.x | bash -  
RUN apt-get install -y nodejs  
RUN npm install -g yarn  
  
# install postgresql  
RUN apt install -y postgresql-13  
RUn mkdir -p -m 777 /var/lib/postgresql/data && chown postgres:postgres /var/lib/postgresql/data  
RUN su postgres -c '/usr/lib/postgresql/13/bin/initdb -D /var/lib/postgresql/data/'  
#RUN su postgres -c '/usr/lib/postgresql/13/bin/pg_ctl start -D /var/lib/postgresql/data'  
RUN apt install -y libpq-dev  
  
# install git cli  
RUN apt update && apt upgrade -y  
RUN apt install -y git  
RUN git config --global init.defaultBranch main  
  
RUN echo "su postgres -c '/usr/lib/postgresql/13/bin/pg_ctl start -D /var/lib/postgresql/data/'" >> /root/.bashrc  

VS CodeのRemote ContainerでこのDockerfile指定すれば後は勝手に以下の内容で開発環境ができあがる(多少時間はかかる)。

  • ruby 3.0.3p157
  • Rails 7.0.1
  • Postgresql 13.5
  • Debian GNU/Linux 11 (bullseye) ※/etc/os-releaseのPRETTY_NAMEを拝借

ちなみにこれでイメージサイズ1.08GBになりますw
ただまあこれだけのセットあって1.08GBで済んでるならまだマシなほうかもと自分に言い聞かせておく。ポジティブシンキングは大事だ!
以下いくつかコメントなどをば

  • 基本的にはRails公式ページのGetting Startedにしたがって必要なものを入れていってるだけである。
  • DBはポスグレを使う(後にrailsのプロジェクト作るときに--database postgresqlオプションを指定する)前提でインストールしている。起動直後にDBもあがってて欲しかったので、最終行にあるように、無理矢理/root/.bashrcにスクリプトを書き込んで、起動と同時にDBもあがるように小細工している。多分これでうまくいくはずだが、行かなかった場合も、起動後にTerminal立ち上げて、/root/.bashrcに書き込んでるコマンドsu postgres -c '/usr/lib/postgresql/13/bin/pg_ctl start -D /var/lib/postgresql/data'打てばDBはあがる。
  • Railsの起動ポート(デフォルト3000番)及びポスグレのポート(デフォルト5432番)をport forwardingすればホスト側からも繋ぐことができる。
  • 余談。busterを使うと、いちいち手動でリポジトリの更新や鍵の追加等をしなきゃポスグレの最新(に近いバージョン)が手に入らなかったので、ベースをbullseyeにしている。ただbulleyeでもポスグレの14入手するには別途リポジトリ更新等の作業が必要である。

Railsプロジェクトの開始

(1)rails new

適当な場所でrails new --database postgresql [プロジェクト名]を実行する。
コマンド実行した直下に[プロジェクト名]のディレクトリが出来上がる。 ここでは仮に「railstest」とでも名付けておく。
rails new --database postgresql railstest

(2)database.ymlの修正

config/database.ymlを開いて、defaultにusernamepasswordを追加する

###(略)###  
default: &default  
  adapter: postgresql  
  encoding: unicode  
  # For details on connection pooling, see Rails configuration guide  
  # https://guides.rubyonrails.org/configuring.html#database-pooling  
  username: railstest                                        # ここと  
  password: <%= ENV.fetch("PJ_DATABASE_PASSWORD") { 5 } %>   # ここを追加  
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>  
###(略)###  
  • usernameは任意の名前に変更すること。ここではプロジェクト名と同じにした。そっちのほうがわかりやすいと思うが。
  • passwordは基本このままでよいのだが、慣習的に接頭辞の"PJ_"の部分はプロジェクト名を付けることが多いようだ。つまり、railstestがプロジェクト名なら<%= ENV.fetch("RAILSTEST_DATABASE_PASSWORD") { 5 } %>とする。なお、パスワードなどいらんということであれば、このフィールド自体物理的に消していい。
  • Railsプロジェクト作成直後のdatabase.ymlなら、developmentとtestはdefaultを変えればそれでいいはずだが(database以外はdefaultそのまま使用する設定になってるので)、productionは別途変更する必要がある。これはdeployする環境とかサービスに応じて適宜変更要である。

(3)createuser

(2)で指定したユーザーをDBに作成する。
以下コマンドを実行する。

su postgres -c '/usr/lib/postgresql/13/bin/createuser -r -d -P railstest'

「railstest」の部分はユーザー名なので(2)のusernameに記述したユーザー名を指定すること。
なお、-Pオプションを指定しているので、コマンド実行後にパスワードの入力を求められる(確認用含めて2回)
パスワードなどなしで良いということであればこの-Pオプションを外せばいいだけ。

ミスってユーザー作っちまった!ということであれば同じ場所にあるdropuserというコマンドで削除できる。
su postgres -c '/usr/lib/postgresql/13/bin/dropuser railstest'

(4)rake db:create

DBを作成する。
以下コマンドを実行する。

bin/rake db:create PJ_DATABASE_PASSWORD='***'

PJ_DATABASE_PASSWORDは(2)でdatabase.ymlのpasswordに書いた環境変数名を記述する。
RAILSTEST_DATABASE_PASSWORDにしたならちゃんとここも変えておく必要がある。
また、***の部分は(3)で入力したパスワードで書き換える。

(5)rails server

railsを起動する。

bin/rails server

ブラウザでhttp://127.0.0.1:3000/にアクセスして以下のような画面が返ってきたら成功。

(6)もろもろ

あとはbin/rake generate controllerだのbin/rake generate modelだのまあ好きにやればよい。