znz/rails7-example という最低限の Rails 7 を devcontainer で動かす例の設定を更新した話です。
環境
- Rails: 7.0.8.1 → 7.1.3.2
- コンテナ: mcr.microsoft.com/devcontainers/ruby 0-3.1-bullseye → 1-3.3-bullseye
- devcontainer 設定: 作成時に VSCode で自動生成できたもの → 3月9日時点の main ブランチの ruby-rails-postgres
Rails のファイルの更新
rails new /tmp/rails7-example -d postgresql で生成したものと比較してマージしました。
db/schema.rb は自動生成対象ではなかったので削除したら、 devcontainer の起動時の rake db:setup が失敗するので、 後で戻しました。
.devcontainer/Dockerfile の FROM mcr.microsoft.com/devcontainers/ruby:0-3.1-bullseye の 3.1 で Ruby 3.1.4 になっていたのを 単純に FROM mcr.microsoft.com/devcontainers/ruby:0-3.2-bullseye のように 3.2 すると、 なぜか最新の 3.2.3 ではなく 3.2.2 になったので、 とりあえず 3.2.2 で更新しました。
devcontainer の設定の更新
https://containers.dev/ あたりから最新のテンプレートを探してみると、 https://github.com/devcontainers/templates/tree/main/src/ruby-rails-postgres にあったので、その設定をマージして更新しました。
Dockerfile
テンプレートを参考にして、 .devcontainer/Dockerfile の FROM は mcr.microsoft.com/devcontainers/ruby:1-3.3-bullseye に更新しました。
devcontainers/images の ruby に mcr.microsoft.com/devcontainers/ruby の説明があって、 先頭の 0- や 1- は イメージのsemver だったとわかりました。
0- だと古い Ruby の拡張が入っていて、Ruby-LSP 拡張に更新するようにうながされるのですが、 1- だと大丈夫でした。
devcontainer.json
次の docker-compose.yml の volumes の変更と組み合わせて "workspaceFolder": "/workspaces/${localWorkspaceFolderBasename}", に変わっていました。
"postCreateCommand": "bundle install && rake db:setup" はコメントアウトされているのを有効にしています。 今なら rake db:setup の代わりに rails db:setup でも良さそうです。
customizations は以下のように拡張機能を列挙しています。
"customizations": {
"vscode": {
"extensions": [
"editorconfig.editorconfig",
"github.vscode-github-actions",
"hediet.debug-visualizer",
"koichisasada.vscode-rdbg"
]
}
}
他のプロジェクトでの devcontainer.json での経験でわかったことも、ついでにメモしておきます。
プロジェクト自体の docker-compose.yml がある場合は "dockerComposeFile": ["../docker-compose.yml", "docker-compose.yml"], のように配列にして上書き部分だけを .devcontainer/docker-compose.yml に書くと良さそうです。
一部のサービスだけ起動したいときは "runServices" で列挙すると良さそうですが、全部起動すればいいなら列挙せずに省略する方が楽です。
起動前にホスト側で何か準備をする必要があれば initializeCommand が使えます。 コンテナの中で実行されるものは postCreateCommand の他に postStartCommand と postAttachCommand があるので、 実行したいタイミングや頻度などによって使いわけると良さそうです。
docker-compose.yml
volumes が - ../..:/workspaces:cached に変わって Rails.root の親ディレクトリからコンテナの中で見えるようになりました。 git から見えてほしくないちょっとしたファイルなどを親ディレクトリに置くことがあるので、そういうものもコンテナの中から見えるようになったのは便利そうです。
隣に git clone したものが必要なときにも使えそうというのも良さそうで、 bitclust の隣に doctree を置いて 開発するというのにも使えそうだと思いました。
テンプレートでは config/database.yml での設定を想定しているのかもしれませんが、 DATABASE_URL 環境変数を追加設定しています。
environment:
DATABASE_URL: postgres://postgres:postgres@db:5432
完全に再作成したいときに devcontainer_postgres-data ボリュームが残っているので、 docker compose -f .devcontainer/docker-compose.yml down -v で消しています。
Dockerfile
Rails 7.1 の rails new で Dockerfile も作成されるようになりましたが、 まだそのファイルは使えていません。
作成された .dockerignore は便利そうなので、他のプロジェクトにも必要な部分をコピーして使うと良さそうだと思いました。
感想
rails 7.1 だけ上げるつもりが docker image が ruby 3.2.2 に対応していなくて調べていたら、 いつの間にか devcontainer の設定更新がメインになってしまっていました。
これを使ってちょっと調べたいときに devcontainer で起動して、 rails g で適当に生成して試して、 git stash -u && git stash drop などで消す、 ということができるようになったので便利です。