以下の内容はhttps://thinkami.hatenablog.com/entry/2026/01/11/231200より取得しました。


既存のRailsアプリを単体でDevContainer化し、RubyMineのDevContainerとして動かしてみた

以前、JetBrains IDEのWebStormを使ってDevContainerを構築しました。
JetBrains WebStormでDevContainerを起動し、DevContainerの中でCodex CLIを実行してみた - メモ的な思考的な

その時はCodexを使えるようにしただけで、DevContainer上でアプリを動かすことはありませんでした。

そこで、mac上で動いている既存のアプリを単体でDevContainer化できないか試してみたことから、メモを残します。

 
目次

 

環境

  • mac
  • Docker Desktop 4.55.0
  • RubyMine 2025.3.1

 
また、既存のアプリは以下の構成とします。

  • Ruby 3.4.8
  • Rails 8.1.2
    • DBとして、PostgreSQL 18.1
    • セッションストアとして、Redis 7
    • .env ファイルから情報取得
    • Railsから外部APIへのアクセスあり
      • 外部APIは、json-server 1.0.0-beta.3
    • privateなgemの利用あり
  • Node.js 24.12.0
    • prettier-ruby 4.0.4 を動かすために利用
      • Railsアプリのフロントエンドはerb製なので、JavaScriptのビルドなどでは利用せず

なお、完全なDevContainer化ではなく、DevContainerも併用できることを目指すため、 .env はホストと共有して残したままにします。

また、今回はRailsアプリだけを単体でDevContainer化します。PostgreSQLやRedisのコンテナは、ホストで動いていたものを引き続き利用します。

 
既存のアプリの詳細については、次のリポジトリを参照してください(記事の末尾でも再掲します)。
https://github.com/thinkAmi-sandbox/rails_local2devcontainer-example

 

利用するDevContainerのイメージについて

Rubyが入っているDevContainerのイメージを調べたところ、次の2つがありました。

Rails公式の方がRubyのバージョンを細かく指定できたり、 mise がインストールされていたりと便利そうだったため、今回はRails公式を使うことにしました。

 

DevContainer化のために考慮したこと

localhostをhost.docker.internalへ差し替え

DevContainer化にあたり、今まで localhost でアクセスしていた部分を修正する必要がありました。DevContainerでの実行では、 localhost がコンテナ自身を指してしまうためです。

既存のアプリで localhost でアクセスしていたところは

の3つです。

localhost の差し替え先は、公式ドキュメントに従い host.docker.internal とします。
Explore networking how-tos on Docker Desktop | How-tos | Docker Docs

 

コンテナだけで使う環境変数をcontainerEnvへ設定

既存のアプリの localhost を指定していたところは環境により変わる可能性があるため、いずれも .env を使って環境変数化していました。

今回、 .env を残しつつ、コンテナでは .env の内容を上書きすることで、手間を減らしたいと考えました。

そこで、devcontainer.jsoncontainerEnv を使って実現することにしました。
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の postCreateCommandmiseを差し替える方法が紹介されていたため、それを設定することにしました。
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にて、ブレークポイントで停止しました。

 
ブレークポイントから先に進めたところ、ブラウザに

の各値が表示されました。良さそうです。

 

ソースコード

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オプションの対象が増えていました。

今回は使いませんでしたが、最近は rails-newコマンドもあるようでした。
https://github.com/rails/rails-new

 
カレントディレクトリ名のプロジェクトを rails newします。 . でカレントディレクトリにRailsのファイルが生成されます。

% bundle exec rails new . --minimal

 
PostgreSQLやRedisを compose.yml で構築します。なお、PostgreSQL18では、ボリュームの位置が /var/lib/postgresql になっています。

 
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 で起動します。




以上の内容はhttps://thinkami.hatenablog.com/entry/2026/01/11/231200より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14