znz/rails7-example という最低限の Rails 7 を devcontainer で動かす例の設定を更新した話です。

環境

Rails のファイルの更新

rails new /tmp/rails7-example -d postgresql で生成したものと比較してマージしました。

db/schema.rb は自動生成対象ではなかったので削除したら、 devcontainer の起動時の rake db:setup が失敗するので、 後で戻しました。

.devcontainer/DockerfileFROM 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/DockerfileFROMmcr.microsoft.com/devcontainers/ruby:1-3.3-bullseye に更新しました。

devcontainers/images の rubymcr.microsoft.com/devcontainers/ruby の説明があって、 先頭の 0-1- は イメージのsemver だったとわかりました。

0- だと古い Ruby の拡張が入っていて、Ruby-LSP 拡張に更新するようにうながされるのですが、 1- だと大丈夫でした。

devcontainer.json

次の docker-compose.ymlvolumes の変更と組み合わせて "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 の他に postStartCommandpostAttachCommand があるので、 実行したいタイミングや頻度などによって使いわけると良さそうです。

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 newDockerfile も作成されるようになりましたが、 まだそのファイルは使えていません。

作成された .dockerignore は便利そうなので、他のプロジェクトにも必要な部分をコピーして使うと良さそうだと思いました。

感想

rails 7.1 だけ上げるつもりが docker image が ruby 3.2.2 に対応していなくて調べていたら、 いつの間にか devcontainer の設定更新がメインになってしまっていました。

これを使ってちょっと調べたいときに devcontainer で起動して、 rails g で適当に生成して試して、 git stash -u && git stash drop などで消す、 ということができるようになったので便利です。

Disqus Comments

Kazuhiro NISHIYAMA

Ruby のコミッターとかやってます。 フルスタックエンジニア(って何?)かもしれません。 About znzに主なアカウントをまとめました。

znz znz


Published