はじめに
AIコーディングエージェントを使う機会が増えています。
これらのツールはソースコードの編集だけでなく、コマンドの実行やパッケージのインストールなども行います。便利な一方で、普段使っている開発環境の設定や、作業対象以外のファイルに意図しない変更が加わることは、できるだけ避けたいところです。
そのため、AIコーディングエージェントは普段の環境で直接実行するよりも、コンテナ内で動かしたいと思うようになりました。
開発環境のコンテナ化には、Dev Container を利用できます。Dev ContainerはDockerコンテナを開発環境として利用するための仕組みで、devcontainer.json にベースイメージや開発ツールなどを定義できます。
ただ、AIコーディングエージェントでリポジトリを少し調査・修正したいだけの場合、その都度設定ファイルを用意したり、コンテナを管理したりするのは手間です。作業が終われば、コンテナも自動的に削除される方が気軽に利用できます。
一方で、コンテナを毎回作り直すとしても、エージェントの設定や認証情報、セッション履歴などは引き継ぎたいところです。
そこで、必要な開発環境をコマンドひとつで作成し、作業が終われば削除するためのコマンドを作りました。
GitHub: devcontainer-sandbox
使い方
作成したコマンドは dcs(Dev Container Sandbox)です。
作業したいディレクトリで実行すると、必要なコンテナを作成して指定したツールやコマンドを起動します。
例えば、OpenCodeを起動する場合は次のようにします。
dcs opencode
カレントディレクトリが自動的にコンテナのワークスペースとしてマウントされます。 Gitリポジトリ内で実行した場合は、カレントディレクトリではなくリポジトリのルートがマウントされます。
現時点では、次のAIコーディングエージェントに対応しています。
| AIコーディングエージェント | コマンド |
|---|---|
| OpenCode | dcs opencode |
| Codex | dcs codex |
| Claude Code | dcs claude |
| Pi Coding Agent | dcs pi |
AIコーディングエージェント以外にも、プログラミング言語の実行環境として利用できます。例えば、次のコマンドでPython 3.12の対話型インタプリタを起動できます。
dcs python:3.12
また、複数の開発ツールを組み合わせることもできます。次のコマンドでは、PythonとNode.jsを利用できるコンテナでBashを起動します。
dcs python,node bash
指定したコマンドが終了すると、起動したコンテナも自動的に削除されます。
インストール
LinuxまたはWSL2での利用を想定しています。Docker Engine、Bash 4以降、Makeが必要です。Dev Container CLIがインストールされていない場合は、導入にnpmも必要です。
git clone https://github.com/temeteke/devcontainer-sandbox.git
cd devcontainer-sandbox
make install
Dev Container CLIが未インストールの場合は、make install によってnpm経由で導入されます。
dcs は ~/.local/bin にインストールされます。必要に応じてPATHに追加してください。
仕組み
dcs は、Dev Container CLI を利用するBash製のラッパーです。
実行時に一時的な devcontainer.json を生成し、devcontainer up と devcontainer exec でコンテナの起動とコマンド実行を行います。コマンドの終了後はDockerを使ってコンテナを削除します。
設定ファイルはリポジトリの外に生成するため、作業対象のリポジトリに .devcontainer を用意する必要はありません。 既存の .devcontainer があっても使用しません。
コンテナ内の開発ツールのインストールには、Dev Container Featuresを利用しています。AIコーディングエージェントや開発用ツールのFeatureは、別リポジトリの devcontainer-features で管理しています。
あらかじめ定義したコンポーネントを組み合わせるだけでなく、--feature オプションで任意のDev Container Featureを追加することもできます。
dcs --feature ghcr.io/devcontainers/features/go:1 opencode
この例では、OpenCodeを実行するコンテナにGoの開発環境を追加します。
コンテナは使い捨て、設定は永続化
毎回新しいコンテナを作成しても、認証や設定をやり直す必要がないようにしています。
各エージェントのFeatureでは、設定やセッションの保存先となるディレクトリをコンテナの外側からマウントします。
例えば、OpenCodeでは次のディレクトリを共有します。
| ディレクトリ | 用途 |
|---|---|
~/.config/opencode |
OpenCodeの設定 |
~/.local/share/opencode |
認証情報やセッションなどのデータ |
~/.agents |
Agent Skillsなどの共有データ |
これにより、コンテナを削除してもエージェントの設定やセッション履歴を引き継げます。
また、ワークスペースもコンテナの外側と共有しているため、コンテナ内で編集したソースコードはそのまま残ります。
なお、共有するディレクトリが存在しない場合は、事前に作成する必要があります。
通常のDev Containerとの違い
通常のDev Containerは、プロジェクトごとに開発環境を定義し、継続的に利用するのに適しています。コンテナを再利用しながら開発を進める場合には、こちらが便利です。
一方、dcs は設定ファイルを事前に用意せず、コマンドを実行するたびにコンテナを作成し、終了後に削除します。一時的な調査や修正に向いています。
注意点
Sandbox という名前ですが、悪意のあるコードを安全に実行できることを保証するものではありません。
作業ディレクトリや一部の設定・認証情報はコンテナから読み書きできるため、信頼できるプロジェクトでの利用を前提としています。
まとめ
AIコーディングエージェントを普段の環境からある程度分離しつつ、普段のコマンドと同じような感覚で手軽に起動したくて dcs を作りました。
コンテナは使い捨てにして、作業ファイルやエージェントの状態は維持する、という使い方をしています。
同じような使い方をしたい人の参考になればと思います。