以前、JetBrains IDEのWebStormを使ってDevContainerを構築しました。
JetBrains WebStormでDevContainerを起動し、DevContainerの中でCodex CLIを実行してみた - メモ的な思考的な
その時はCodexを使えるようにしただけで、DevContainer上でアプリを動かすことはありませんでした。
そこで、mac上で動いている既存のアプリを単体でDevContainer化できないか試してみたことから、メモを残します。
目次
- 環境
- 利用するDevContainerのイメージについて
- DevContainer化のために考慮したこと
- DevContainer向けのファイル
- 動作確認
- ソースコード
- 補足:既存のRailsアプリの作成ログ
環境
- mac
- Docker Desktop 4.55.0
- RubyMine 2025.3.1
また、既存のアプリは以下の構成とします。
- Ruby 3.4.8
- Rails 8.1.2
- Node.js 24.12.0
- prettier-ruby 4.0.4 を動かすために利用
- Railsアプリのフロントエンドはerb製なので、JavaScriptのビルドなどでは利用せず
- prettier-ruby 4.0.4 を動かすために利用
なお、完全なDevContainer化ではなく、DevContainerも併用できることを目指すため、 .env はホストと共有して残したままにします。
また、今回はRailsアプリだけを単体でDevContainer化します。PostgreSQLやRedisのコンテナは、ホストで動いていたものを引き続き利用します。
既存のアプリの詳細については、次のリポジトリを参照してください(記事の末尾でも再掲します)。
https://github.com/thinkAmi-sandbox/rails_local2devcontainer-example
利用するDevContainerのイメージについて
Rubyが入っているDevContainerのイメージを調べたところ、次の2つがありました。
- DevContainer公式
- Rails公式
Rails公式の方がRubyのバージョンを細かく指定できたり、 mise がインストールされていたりと便利そうだったため、今回はRails公式を使うことにしました。
DevContainer化のために考慮したこと
localhostをhost.docker.internalへ差し替え
DevContainer化にあたり、今まで localhost でアクセスしていた部分を修正する必要がありました。DevContainerでの実行では、 localhost がコンテナ自身を指してしまうためです。
既存のアプリで localhost でアクセスしていたところは
- PostgreSQL
- Redis
- 外部API
の3つです。
localhost の差し替え先は、公式ドキュメントに従い host.docker.internal とします。
Explore networking how-tos on Docker Desktop | How-tos | Docker Docs
コンテナだけで使う環境変数をcontainerEnvへ設定
既存のアプリの localhost を指定していたところは環境により変わる可能性があるため、いずれも .env を使って環境変数化していました。
今回、 .env を残しつつ、コンテナでは .env の内容を上書きすることで、手間を減らしたいと考えました。
そこで、devcontainer.json の containerEnv を使って実現することにしました。
General devcontainer.json properties | Dev Container metadata reference
Private gemを参照するためにGitHub CLIを導入
JetBrains IDEのDevContainerでは、GitHubの認証情報はSSH鍵方式のみでした。
Using SSH keys | RubyMine Documentation
今回はGitHubアカウントにMFAが設定されていること、GitHubのPersonal Access Tokenは利用したくないことから、GitHub CLIを導入して、コンテナの中で手動で gh auth loginすることにしました。
DevContainer向けのGitHub CLIについては、DevContainerのfeatureとして公式から提供されているため、これを使うことにしました。
https://github.com/devcontainers/features/blob/main/src/github-cli/README.md
Node.jsをDevContainerのfeatureで導入
今回、prettier-rubyをDevContainerの中で使うことから、Node.jsが必要です。
DevContainerのfeatureにあるNode.jsでは、細かくバージョンを指定できそうでしたので、これを使うことにしました。
https://github.com/devcontainers/features/blob/main/src/node/README.md
RubyMineでDevContainerを使うときのワークアラウンド
RubyMine 2025.3.1の時点では、Rails公式のDevContainerを使うとRubyインタープリタがDevContainerの中で認識されないという問題があります。
Cannot find Ruby interpreter in the Rails devcontainer : RUBY-34350
上記issueでは、ワークアラウンドとして、Lifecycle scriptsの postCreateCommandで miseを差し替える方法が紹介されていたため、それを設定することにしました。
Lifecycle scripts | Dev Container metadata reference
DevContainer向けのファイル
devcontainer.json
考慮したことを踏まえると、以下となりました。
{ "name": "rails_local2devcontainer-example", // Rails公式のDevContainerを利用 "image": "ghcr.io/rails/devcontainer/images/ruby:3.4.8", "mounts": [ "source=${localEnv:HOME}/.agent/codex/.codex,target=/home/vscode/.codex,type=bind,consistency=cached", ], "features": { // Node.jsはfeatureで入れておく "ghcr.io/devcontainers/features/node:1": { version: "24.12.0" }, // プライベートリポジトリにあるgemを利用するために、GitHub CLIをインストールしておく "ghcr.io/devcontainers/features/github-cli:1": {}, // curlなどのツールを導入しておく "ghcr.io/devcontainers/features/common-utils:2": {} }, // ホストでlocalhostでアクセスしていたものを差し替える "containerEnv": { "DATABASE_HOST": "host.docker.internal", "REDIS_URL": "redis://host.docker.internal:15531", "API_URL": "http://host.docker.internal:3001" }, // 外部からコンテナのRailsへアクセスできるようポートフォワードする "forwardPorts": [3000], // RubyMine向けのワークアラウンドやnpm installするため、postCreateCommandを用意する "postCreateCommand": ".devcontainer/postCreateCommand.sh", "customizations": { "jetbrains": { "plugins": [ "com.github.thinkami.railroads", "com.intellij.plugins.mnemonicKeymap" ] } } }
postCreateCommand.sh
DevContainerのpostCreateCommandで使うスクリプトです。
コメントにもある通り、このファイルは事前にホストで chmod +x postCreateCommand.sh しておきます。
#!/bin/sh set -eu # DevContainerを起動する前に、このファイルを `chmod +x postCreateCommand.sh` しておく # RubyMine 2025.3.1 の既知の不具合 # https://youtrack.jetbrains.com/projects/RUBY/issues/RUBY-34350/Cannot-find-Ruby-interpreter-in-the-Rails-devcontainer # ただし、プライベートなgemのインストールがあるため、最後の `bin/setup --skip-server` は実行せず、コンテナ内で自分で実行する sudo mkdir -p /.jbdevcontainer/config /.jbdevcontainer/data && sudo chmod -R 777 /.jbdevcontainer && ln -s /home/vscode/.config/mise /.jbdevcontainer/config/mise && ln -s /home/vscode/.local/share/mise /.jbdevcontainer/data/mise # package.jsonの中身をインストールする npm install
動作確認
Railsを動かすための準備
RubyMineから Create Dev Container and Mount Sources...をクリックします。
すると、ビルドが進み、 npm install まで完了しました。
そこで、 Open Project をクリックし、Trust project すると、別のRubyMineが起動しました。
RubyMineのターミナルを開くとmiseのエラーが出ました。
mise ERROR error parsing config file: /IdeaProjects/rails_local2devcontainer-example/mise.toml mise ERROR Config files in /IdeaProjects/rails_local2devcontainer-example/mise.toml are not trusted. Trust them with `mise trust`. See https://mise.jdx.dev/cli/trust.html for more information. mise ERROR Run with --verbose or MISE_VERBOSE=1 for more information
mise.tomlの内容はローカルと一緒になっていることを確認の上、 mise trust します。
mise trust | mise-en-place
$ mise trust mise trusted /IdeaProjects/rails_local2devcontainer-example
RubyやNode.jsがインストールされていることを確認します。
$ ruby -v ruby 3.4.8 (2025-12-17 revision 995b59f666) +PRISM [aarch64-linux] $ node -v v24.12.0
プライベートgemをインストールする必要があるため、 gh auth login します。GitHub.comでHTTPSによるアクセスを行うよう選択し、ブラウザに表示されているコードを入力します。
$ gh auth login ? Where do you use GitHub? GitHub.com ? What is your preferred protocol for Git operations on this host? HTTPS ? Authenticate Git with your GitHub credentials? Yes ? How would you like to authenticate GitHub CLI? Login with a web browser ! First copy your one-time code: ****-****
正しいコードを入力したところ、認証が完了しました。
✓ Authentication complete. - gh config set -h github.com git_protocol https ✓ Configured git protocol ! Authentication credentials saved in plain text ✓ Logged in as thinkAmi
あとは bundle installし、プライベートなgemも含めてインストールできました。
$ bundle install Fetching https://github.com/thinkAmi-sandbox/private_hello_gem.git ... Installing rails 8.1.2 Bundle complete! 12 Gemfile dependencies, 82 gems now installed.
これでDevContainerの中でRailsが起動できるようになりました。
Railsの動作確認
RubyMineでデバッグできるか確認するため、ブレークポイントを設定した上でデバッグ実行します。
ブラウザで localhost:3000 へアクセスしたところ、DevContainerの中のRubyMineにて、ブレークポイントで停止しました。
ブレークポイントから先に進めたところ、ブラウザに
- PostgreSQL
- Redisのセッション変数
- 環境変数
- プライベートgem
の各値が表示されました。良さそうです。
ソースコード
GitHubに上げました。
https://github.com/thinkAmi-sandbox/rails_local2devcontainer-example
既存のアプリを追加したときのプルリクはこちら。
https://github.com/thinkAmi-sandbox/rails_local2devcontainer-example/pull/1
DevContainer化したときのプルリクはこちら。
https://github.com/thinkAmi-sandbox/rails_local2devcontainer-example/pull/2
補足:既存のRailsアプリの作成ログ
rails new するのも久しぶりなので、作成ログを残しておきます。
RubyのインストールとGemfileの作成をします。
% mise use ruby@3.4.8 % bundle init
Gemfileで、Railsのコメントアウトを外し、 bundle installします。
% cat Gemfile # frozen_string_literal: true source "https://rubygems.org" gem "rails" % bundle install ... Installing rails 8.1.2 Bundle complete! 1 Gemfile dependency, 67 gems now installed.
rails newします。今回は最低限の機能で良かったので、 --minimal オプションを使います。
ちなみに、 minimalオプションの対象が増えていました。
- Minimal apps, reply_to address, rotate secrets, podman support
- Extend --minimal option by eelcoj · Pull Request #54313 · rails/rails
今回は使いませんでしたが、最近は rails-newコマンドもあるようでした。
https://github.com/rails/rails-new
カレントディレクトリ名のプロジェクトを rails newします。 . でカレントディレクトリにRailsのファイルが生成されます。
% bundle exec rails new . --minimal
PostgreSQLやRedisを compose.yml で構築します。なお、PostgreSQL18では、ボリュームの位置が /var/lib/postgresql になっています。
- PostgreSQL18コンテナのマウント先の仕様変更 - 行き先なし
- Mysterious Docker issue with postgres - General - Docker Community Forums
pg gemを追加してからマイグレーションをします。コントローラも生成します。
% bin/rails generate model Apple name:string % bin/rails db:migrate == 20260111023113 CreateApples: migrating ===================================== -- create_table(:apples) -> 0.0031s == 20260111023113 CreateApples: migrated (0.0032s) ============================ % bin/rails generate controller Apples index
データの投入用seedとして、 db/seeds を作成します。
names = %w[奥州ロマン シナノゴールド シナノドルチェ] names.each { |name| Apple.find_or_create_by!(name: name) }
投入します。
% bin/rails db:seed
続いて、 prettier-rubyの環境構築です。
miseでNode.jsをインストールします。その後、 npmで prettire-rubyをインストールします。なお、prettier-rubyを使うにはgemが必要です。
https://github.com/prettier/plugin-ruby?tab=readme-ov-file#getting-started には4つ書かれていますが、今回は minimal なRailsなので、以下の2つで十分でした。
- prettier_print
- syntax_tree
最後にモックのAPIサーバとして、 json-serverを用意します。
https://github.com/typicode/json-server
レスポンスデータとして、以下のJSONを作成します。
{ "items": [ { "id": 1, "price": 100 }, { "id": 2, "price": 200 }, { "id": 3, "price": 300 } ] }
あとは npx json-server db.json で起動します。


