prefix_rule(pattern=["pmrails-cmpexe","bin/rails",["test","test:system","routes","zeitwerk:check"],],decision="allow",justification="Allow common Rails development commands through PmRails.",)
$ docker run --rm -it ruby:4.0.3 bash
root@601c809deee7:/# gem -v
4.0.6
root@601c809deee7:/# gem install rdoc -v 7.2.0
Fetching rdoc-7.2.0.gem
Successfully installed rdoc-7.2.0
1 gem installed
A new release of RubyGems is available: 4.0.6 → 4.0.11!
Run `gem update --system 4.0.11` to update your installation.
root@601c809deee7:/# gem -v
/usr/local/bundle/gems/rdoc-7.2.0/lib/rdoc/version.rb:8: warning: already initialized constant RDoc::VERSION
/usr/local/lib/ruby/gems/4.0.0/gems/rdoc-7.0.3/lib/rdoc/version.rb:8: warning: previous definition of VERSION was here
/usr/local/bundle/gems/rdoc-7.2.0/lib/rdoc.rb:68: warning: already initialized constant RDoc::VISIBILITIES
/usr/local/lib/ruby/gems/4.0.0/gems/rdoc-7.0.3/lib/rdoc.rb:68: warning: previous definition of VISIBILITIES was here
/usr/local/bundle/gems/rdoc-7.2.0/lib/rdoc.rb:74: warning: already initialized constant RDoc::DOT_DOC_FILENAME
/usr/local/lib/ruby/gems/4.0.0/gems/rdoc-7.0.3/lib/rdoc.rb:74: warning: previous definition of DOT_DOC_FILENAME was here
/usr/local/bundle/gems/rdoc-7.2.0/lib/rdoc.rb:79: warning: already initialized constant RDoc::GENERAL_MODIFIERS
/usr/local/lib/ruby/gems/4.0.0/gems/rdoc-7.0.3/lib/rdoc.rb:79: warning: previous definition of GENERAL_MODIFIERS was here
/usr/local/bundle/gems/rdoc-7.2.0/lib/rdoc.rb:84: warning: already initialized constant RDoc::CLASS_MODIFIERS
/usr/local/lib/ruby/gems/4.0.0/gems/rdoc-7.0.3/lib/rdoc.rb:84: warning: previous definition of CLASS_MODIFIERS was here
/usr/local/bundle/gems/rdoc-7.2.0/lib/rdoc.rb:89: warning: already initialized constant RDoc::ATTR_MODIFIERS
/usr/local/lib/ruby/gems/4.0.0/gems/rdoc-7.0.3/lib/rdoc.rb:89: warning: previous definition of ATTR_MODIFIERS was here
/usr/local/bundle/gems/rdoc-7.2.0/lib/rdoc.rb:94: warning: already initialized constant RDoc::CONSTANT_MODIFIERS
/usr/local/lib/ruby/gems/4.0.0/gems/rdoc-7.0.3/lib/rdoc.rb:94: warning: previous definition of CONSTANT_MODIFIERS was here
/usr/local/bundle/gems/rdoc-7.2.0/lib/rdoc.rb:99: warning: already initialized constant RDoc::METHOD_MODIFIERS
/usr/local/lib/ruby/gems/4.0.0/gems/rdoc-7.0.3/lib/rdoc.rb:99: warning: previous definition of METHOD_MODIFIERS was here
/usr/local/bundle/gems/rdoc-7.2.0/lib/rdoc/markdown.rb:257: warning: already initialized constant RDoc::Markdown::KpegPosInfo
/usr/local/lib/ruby/gems/4.0.0/gems/rdoc-7.0.3/lib/rdoc/markdown.rb:257: warning: previous definition of KpegPosInfo was here
/usr/local/bundle/gems/rdoc-7.2.0/lib/rdoc/markdown/entities.rb:5: warning: already initialized constant RDoc::Markdown::HTML_ENTITIES
/usr/local/lib/ruby/gems/4.0.0/gems/rdoc-7.0.3/lib/rdoc/markdown/entities.rb:5: warning: previous definition of HTML_ENTITIES was here
/usr/local/bundle/gems/rdoc-7.2.0/lib/rdoc/markdown/literals.rb:86: warning: already initialized constant RDoc::Markdown::Literals::KpegPosInfo
/usr/local/lib/ruby/gems/4.0.0/gems/rdoc-7.0.3/lib/rdoc/markdown/literals.rb:86: warning: previous definition of KpegPosInfo was here
/usr/local/bundle/gems/rdoc-7.2.0/lib/rdoc/markdown/literals.rb:446: warning: already initialized constant RDoc::Markdown::Literals::Rules
/usr/local/lib/ruby/gems/4.0.0/gems/rdoc-7.0.3/lib/rdoc/markdown/literals.rb:446: warning: previous definition of Rules was here
/usr/local/bundle/gems/rdoc-7.2.0/lib/rdoc/markdown.rb:584: warning: already initialized constant RDoc::Markdown::EXTENSIONS
/usr/local/lib/ruby/gems/4.0.0/gems/rdoc-7.0.3/lib/rdoc/markdown.rb:584: warning: previous definition of EXTENSIONS was here
/usr/local/bundle/gems/rdoc-7.2.0/lib/rdoc/markdown.rb:589: warning: already initialized constant RDoc::Markdown::DEFAULT_EXTENSIONS
/usr/local/lib/ruby/gems/4.0.0/gems/rdoc-7.0.3/lib/rdoc/markdown.rb:589: warning: previous definition of DEFAULT_EXTENSIONS was here
/usr/local/bundle/gems/rdoc-7.2.0/lib/rdoc/markdown.rb:16430: warning: already initialized constant RDoc::Markdown::Rules
/usr/local/lib/ruby/gems/4.0.0/gems/rdoc-7.0.3/lib/rdoc/markdown.rb:16420: warning: previous definition of Rules was here
4.0.6
root@601c809deee7:/# gem list --exact rdoc
(同様のwarningなので省略)
*** LOCAL GEMS ***
rdoc (7.2.0, 7.0.3)
root@601c809deee7:/#
vscodeのdevcontainerでCodexを使うのを今は見送りにした理由
AIエージェント用の安全な開発環境について調べた結果を記事に整理しましたので、ご参考まで。
https://note.com/picolab/n/nd7dbc78548df
なお、この記事の内容のポイントとしては、以下の通りです。
vscodeのdevcontainerでCodexを使うのを今は見送りにした理由
2026年9月現在では、以下のようにdev containers内でcodexを動かす方法についてドキュメントが存在しています。 ですので、vscodeのdevcontainerでCodexを使うのは、現在では現実的な選択肢のようです。
https://learn.chatgpt.com/docs/agent-approvals-security#run-codex-in-dev-containers
メンテナンスのお知らせ
メンテナンスが終了いたしました。
メンテナンスのお知らせ
2026/09/20 13:20頃からメンテナンスを実施します。終了は同日14:00頃を予定しています。
メンテナンス中もTechTipsへのアクセスは可能ですが、ログイン等が失敗した場合には、お手数ですが、時間をおいてから再度の操作をお願いいたします。
PmRails v2.0 / DkRails v2.0をリリースしました
Railsの開発環境をコンテナ内に作るための PmRails v2.0 をリリースしました。
また、PmRailsと同等の開発スタイルをDockerで利用できる DkRails も新しく公開しました。
どちらも、ホスト環境にRubyやRailsをインストールせずにRailsを開発することを目的としたツールです。
PmRails v2.0
PmRails v1では、RailsをPodmanコンテナ内で実行するための比較的小さなツールとしてスタートしました。
v2では機能を大幅に拡張し、Railsアプリの新規作成から日常的な開発まで、より一通りの作業を扱えるようになりました。
主に次の3つの使い方ができます。
rails newだけをコンテナ内で実行する既存のRailsプロジェクトに対しては、
pmrails-initで標準的な設定ファイルを生成できます。Compose環境ではSQLite3に加え、PostgreSQL、MySQL、MariaDB系の構成や、Seleniumを使ったsystem testにも対応しています。
独自のDockerfileやCompose設定も利用できるため、簡単な構成から始めて、必要に応じてプロジェクト固有の環境へ拡張できます。
詳しい変更内容は以下にあります。
PmRails v2.0.0 Release
Docker版のDkRailsも公開
これまでPmRailsはPodmanを前提としていました。
今回、同じ考え方とほぼ同じ操作体系をDockerで利用できる DkRails を公開しました。
たとえば、
に対応するDkRailsのコマンドは、
です。
そのため、
という形で、利用するコンテナ環境に応じて選べます。
DkRails v2.0.0 Release
AIを使った開発にも
最近では、Codexなどのcoding agentにコードの編集だけでなく、テストやRailsコマンドの実行まで任せる機会が増えてきました。
このとき、AIにホスト上のコマンド実行を広く許可するのではなく、Railsの実行をPmRails/DkRails経由に寄せるという使い方ができます。
たとえばCodexでは、
.codex/rules/default.rulesに次のようなルールを書くことで、よく使うRailsコマンドだけを自動許可できます。これにより、AIにはテストなどの日常的なRails操作を任せながら、その実行環境をコンテナ側に置くことができます。
一方、
runnerやconsole、任意のRake taskなど、より広い操作能力を持つコマンドは、この例では自動許可していません。もちろん、コンテナは完全なセキュリティsandboxではありません。bind mountされたファイルや、コンテナからアクセス可能なDB・ネットワークなどには影響できます。
それでも、
という境界を自然に作れるのは、AIを使った開発でも便利だと感じています。
PmRails/DkRailsはAI専用のツールではありませんが、もともとRailsの実行環境をホストから分離するために作っていたことが、AI coding agentを使う上でも役立つ形になりました。
Links
シェルで複数ファイルに対して一括して文字列置換処理を行うコマンド
例として、シェルでgitで管理している全ての.cファイル内にあるabcをdefに置換する一行の書き方は以下の通りです。
-zと-0により、空白や改行を含むファイル名にも対応します。このようなファイル名がない場合には、-zと-0の両方のオプションを外してOKです。-rは対象ファイルが0件ならsedを実行しません(GNUxargs)。なお、macOS/BSD系の
sedでは次のようにするらしいです。`git diff --check`のHEAD全体への適用方法とempty treeのハッシュ値
git diff --checkは、(バイナリファイルを除く)diffの内容にtrailing whitespace等が無いかをチェックできるコマンドです。チェック対象を通常の差分ではなく、HEADのファイル全体にしたい場合は、以下のように実行します。
HEADのファイル全体をチェックする仕組みと「empty treeのハッシュ値」
上述のコマンドでは、「何のファイルもないtreeのハッシュ値」とHEADの間でdiffを取ることで、 diffの結果がHEADのファイルの内容全体となり、それがチェックされるようにしています。
では「何のファイルもないtreeのハッシュ値」つまり「empty treeのハッシュ値」をどう求めれば良いかと言いますと、
git hash-object -t tree /dev/nullとなります。ちなみに「empty treeのハッシュ値」は、上記のように定数値ではあるのですが、 gitで用いるハッシュの計算方法(アルゴリズムなど)が変わればこの定数値も変わりますので、 定数として持たず
git hash-objectに計算させた方が安全です。Docker imageのruby:4.0.4-alpine3.23でRails 8.1.3を利用するために必要な変更
Dockerfileに以下の記述を追加して、C言語拡張 (native extension) のgemのビルドを可能にします。
Gemfileの
gem "tzinfo-data", platforms: %i[ windows jruby ]の行からプラットフォーム指定 (platforms ~) を外して、 tzinfo-data gemがインストールされるようにします。以上の変更で、rails serverが無事立ち上がるようになることを確認しました。
Ruby 4.0でrdocを追加インストールするとwarningが出るようになる
Ruby 3.4の場合
Rubyの3.4系列では、default gemの1つとして、rdocが標準添付されています。 ここにrdocを追加インストールしてもwarningが出るようにはなりません。
以下はdockerを使ってこのことを確認した様子です。
Ruby 4.0でrdocを追加インストールするとwarningが出るようになる
Ruby 4.0の場合
Rubyの4.0系列では、bundled gemの1つとして、rdocが標準添付されています。 ここにrdocの最新バージョンをインストールするようなシチュエーションで、rdocを追加インストールするとwarningが出るようになります。
この現象は、dockerを使うと、以下のように簡単に再現できます。
ruby:4.0.3において、始めはgem -vコマンドの実行でwarningは出ませんが、 rdocをインストールすると、同じgem -vコマンドでwarningが出ていることが確認できます。