Cline / RooCodeを安全に使うためにDevContainerを使い始めた
AIコーディングエージェントは便利ですが、意図しない挙動を行った時に、被害を最小限にとどめる工夫がいるな〜と思っています。例えば、なんらかの設定をミスって、rm -rfが暴走するとか、無限ループを実行してしまうといったインシデントが考えられます。
当初そのために、今お買い得なXserver VPSを借りて快適な独立した作業環境を構築していました。4GBインスタンスでVSCode ServerとDockerを動かしてたんですが、メモリ使用に耐えられなくなってきて。ちょくちょくOOM(Out of Memory)が出て、「うーん、これは厳しいかな」と感じてました。
そこで、自宅PCを刷新して開発用VMをプロジェクトごとに建てようかと思ったんですが、それはそれでオーバーヘッドでかいですよね。OS管理とかアップデートとか考えると面倒くさい。
要は、プロセスが分離されてて、ワーキングディレクトリ外に影響を与えない環境があればいいわけで、Dockerみたいにガッチリ分離できれば最高だな〜とぼんやり思ってました。
そういえばDevContainerとかいうのがあったなと思い出し、遅ればせながら入門してみることに。今回はDockerfileからガッツリ作るバージョンでやってみました。ClineやRooCodeを安全に使う環境を整えるメモを残します。
DevContainerとは
DevContainer、正式名称「Development Container」は、VSCodeの拡張機能を使って開発環境をコンテナ化する仕組みです。Dockerコンテナの中で開発環境をまるっと構築するから、ローカル環境を汚さないし、依存関係とかプロジェクトごとに独立した環境が作れるんで、「あのライブラリが他のプロジェクトのバージョンアップで動かない!」みたいなのを回避できます。
イメージ的には「Dockerで開発環境を固めて、その中でVSCode(のサーバ)を動かす」感じ。コンテナ内で完結するから、仮にAIツールが暴走してもPC内の大事なファイルが消し飛ぶ心配がないわけです。
こういう、ローカル側でVSCodeのGUIが動いて、コンテナ内にもVSCodeのdaemonがいる感じです。
ちなみにSSH経由でVMに繋ぐ時もほぼ同じ
設定はプロジェクトごとに .devcontainer/devcontainer.json
で管理します。今回は最初からDockerfileを使ってカスタム環境を作るアプローチでいきます。作成したらDevContainer拡張をインストールして、VSCodeの左下の接続アイコンから「Dev Containers: Reopen in Container」を選べば、環境構築が始まります。
例えばPHP LaravelのDevContainerをDockerfileで作ってみる
具体的なサンプルも置いておきます。PHPのLaravelプロジェクトを例に、Dockerfileを使ってDevContainerを作ってみましょう。
まず、プロジェクトフォルダ内に.devcontainerディレクトリを作ります。そして、Dockerfileを以下みたいに書きます。ユーザーをvscodeにするかどうかは今後検証します。いつもパーミッションしくじるので。
FROM php:8.4-fpm
# Install system dependencies
RUN apt-get update && apt-get install -y \
libpng-dev \
libjpeg-dev \
libfreetype6-dev \
libzip-dev \
unzip \
git \
&& docker-php-ext-configure gd --with-freetype --with-jpeg \
&& docker-php-ext-install gd zip
# Install Composer
COPY /usr/bin/composer /usr/bin/composer
# Set working directory
WORKDIR /var/www
# Create the vscode user
ARG USERNAME=vscode
ARG USER_UID=1000
ARG USER_GID=$USER_UID
RUN groupadd --gid $USER_GID $USERNAME \
&& useradd --uid $USER_UID --gid $USER_GID -m $USERNAME
# Copy existing application directory contents
COPY . .
# Install PHP dependencies
# RUN composer install
# Install Node.js and npm
RUN curl -fsSL https://deb.nodesource.com/setup_22.x | bash - && \
apt-get install -y nodejs
# Install npm dependencies
#RUN npm install
# Expose port 9000 and start php-fpm server
EXPOSE 9000
CMD ["php-fpm"]
次に、devcontainer.jsonをこんな感じで。
{
"name": "Laravel DevContainer",
"dockerFile": "Dockerfile",
"context": "..",
"appPort": [8000],
"customizations": {
"vscode": {
"extensions": [
"bmewburn.vscode-intelephense-client",
"onecentlin.laravel-blade",
"rooveterinaryinc.roo-cline",
"dbaeumer.vscode-eslint",
]
},
"settings": {
"php.validate.executablePath": "/usr/local/bin/php",
"editor.formatOnSave": true
}
},
"postCreateCommand": "",
"remoteUser": "vscode"
}
- dockerfile: Dockerfileをを指定。buildとcontextも使える。
- customizations: VSCodeで使うPHP拡張機能(Intelephenseで補完、Xdebugでデバッグ)を指定。
- forwardPorts: Laravelのphp artisan serveで使うポートを公開。
- "rooveterinaryinc.roo-cline", の行は後述。残りはLaravel関係
これでVSCodeをコンテナ内で再起動すると、Laravel環境が立ち上がります。コンテナ内でphp artisan serve --host=0.0.0.0叩けば、ローカルからhttp://localhost:8000でアクセス可能。
RooCodeをインストール
さて、本題のRooCodeをDevContainerに組み込みます。当初VSCode左側の拡張欄からインストールしてみたんですが、devcontainer.jsonは自動で更新されなかったので、自分で記述してリビルドするか、GUIでインストールしつつjsonにも書くけどリビルドはしない、となるようです。
追記:docker-compose.yml使ってる場合はどうする?
無事セットアップして動作確認したところ、データベースに繋がらないことに気づきました。そうですね、DBないですからね。
調べたところDevContainerにはdocker-composeにも対応していました。devcontainerのDockerfileを指定するところを、docker-compose.ymlファイルを指定して、appコンテナ(VS Code Serverをインストールする)を指定するだけです。
"dockerFile": "Dockerfile",
↓
"dockerComposeFile": "../docker-compose.yml",
"service": "php-fpm",
"workspaceFolder": "/var/www/html",
元々こんな感じだったのが
こうなるイメージです。
コンテナ内で編集されているのでプロジェクト外をいじることはありません。
まとめ
DevContainerをCopilotに助けてもらいながらサクッと入門してみていい感じでした。VPSやVMを自分で管理するよりコストも手間もかからないし、AIツールを安全に試せる環境が手に入るし。RooCodeやClineを使うなら、ぜひDevContainerにチャレンジしてみてください。
Discussion