Cursorでcontainer-useを使う

container-use

https://github.com/dagger/container-use

Container Use を利用すると、各コーディングエージェントがそれぞれ独自のコンテナ化された環境を持てます。これにより、1つのエージェントにつきっきりになる状態から、複数のエージェントがあなたの好むスタックで安全かつ独立して作業できるようになります。 (翻訳まんま)

AIが生成した処理結果はGitブランチを通じてやりとりします。 DockerとGitが入っていることが前提のツール。

Google Julesとか最近のAIのコード生成ツールは、最初にGitのbranchを作って、そこで作業するようになっているので、container-useを使うと、そのお作法に似たことができるわけですね。


1. セットアップ手順

1-1. container-use コマンドのインストール

curl -fsSL https://raw.githubusercontent.com/dagger/container-use/main/install.sh | bash

デフォルトでは ~/.local/bin/cu にインストールされます。
Macの場合、/usr/bin/cu が入っているので、どこかPATHが通らない場所に移動しても良いと思います。 コマンド名が被っているのは嫌ですよね。
名前を変えたい、というissueも無くはないですね。closeされてましたけど。

mkdir -p ~/.cursor/local/bin
mv ~/.local/bin/cu ~/.cursor/local/bin
rm -rf ~/.local/bin

1-2. MCP設定

CursorのMCP設定ファイル(mcp.json)に以下を追加します。 これは設定例なので、cuコマンドのPATHは適当に修正してください。

{
  "mcpServers": {
    "container-use": {
      "command": "/Users/taku-o/.cursor/local/bin/cu",
      "args": ["stdio"]
    }
  }
}

設定後、Cursorを再起動し、container-useのMCPが読み込まれているか確認しておきましょう。

1-3. ルールファイルの生成

プロジェクトのルートディレクトリで、container-use用のルールファイルを生成します。

curl --create-dirs -o .cursor/rules/container-use.mdc \
  https://raw.githubusercontent.com/dagger/container-use/main/rules/cursor.mdc

毎回手動で実行するのが面倒になら、スクリプト化しておくと良いと思います。

cat > ~/bin/cu-rule-generate <<'EOF'
curl --create-dirs -o .cursor/rules/container-use.mdc \
  https://raw.githubusercontent.com/dagger/container-use/main/rules/cursor.mdc
EOF
chmod +x ~/bin/cu-rule-generate

2. container-use を使ってみる

2-1. プロジェクトの準備

container-useはGitを利用して動作するので、 操作対象のプロジェクトがGitで管理されている状態でないといけません。
最初にプロジェクトをgit init、git commitまでしておきます。

mkdir hello_world
cd hello_world
git init
echo "Hello World" > README.md
git add .
git commit -m "initial upload"

2-2. ルールファイルの用意

Cursorを開き、ルールファイルを作成します。

curl --create-dirs -o .cursor/rules/container-use.mdc \
  https://raw.githubusercontent.com/dagger/container-use/main/rules/cursor.mdc

2-3. コード生成の依頼

Cursorには複数Workspaceを利用して開発する機能がありますが、自分はあまり信用していません。
CursorのAIが生成したファイルを変な場所に出力してしまう。よくありますよね。
プロジェクトはworkspaceルートにある方が良いですね。

ターミナルで"cursor ."と実行すると、カレントディレクトリをworkspaceルートにしてCursorが立ち上がります。 このテク、最近6/6にあった、Cursor Meetup Tokyoで知りました。

cursor .

Cursorを開いたら、AIにコードを生成して貰います。
例:

作るコードは
Go製で
コマンドを実行するとhello worldと表示する
CLIアプリを作って欲しい。
できるだけ簡単な作りで。

出来た!
(スクリーンショット取り忘れただけだから、詳細少し違うのは気にしてはいけない)

git branchが作成されて、そこにコードが作成されます。

この結果が気に入らない場合は、追加でAIとお話しして直して貰いましょう。
終わったら、branchをマージするなら、GitHubにpushして、Pull Requestを作成するなりすることになります。


3. 気づいたこと

3-1. container-useが使われないことがある

container-useが使われずに、ローカルにもファイルを作られてしまう時があります。
AIにMCPのcontainer-use使ってください、と言えば良いのだろうか?

駄目でした。

cursorコマンドで立ち上げたから、ルールファイルをまだ読んでいないのが原因でしょうか。 @Fileでcontainer-use.mdcを読ませてしまうのが良いかもです?

3-2. container-useが作ったdockerのcontainerが残っている

container-useが作業時にDockerのコンテナを作るのですが、 "docker ps"コマンドで確認すると、 それが作業終了後にも残っています。 作成したコードに対して、まだまだ追加で修正をしてもらう可能性があるので、作業終了後に即コンテナを消されても困ります。なので、わからなくもない挙動ではあります。

docker ps

一通りの作業が終わったら、"docker stop"をして、コンテナを停止するのが良いと思います。

docker stop <container_id>
docker stop 14cbc892ea42

3-3. container作成に失敗することがある。

container-useがコンテナを作る際、

Missing required parameter 'secrets' for tool environment_update

とメッセージが出て、コンテナ作成に失敗することがあります。原因不明。
しばらく後に試したら問題なくなりました。

これが発生すると、その時点で作業を中止してくれずに、 そのまま作業を進めてコードをファイルシステムに出力して、環境を汚してします。
アー困ります困ります。 なにか工夫が要るかもしれない。