devcontainer-exec について
Devcontainer 内でプロジェクトコマンドを実行するための運用スキルです。コンテナ、ユーザー、作業ディレクトリを先に確認し、ホスト側への誤ったフォールバックや曖昧な対象指定を防ぎます。
主な機能
- 01Devcontainer の特定と検証
- 02コンテナのユーザーと作業場所の確認
- 03docker exec によるコマンド実行
- 04ホスト作業とコンテナ作業の区別
- 05コンテナのライフサイクルに関する安全規則
活用シーン
- 01コンテナ内でプロジェクトをビルドまたはテストする
- 02コンテナ内で lint や型チェックを実行する
- 03ワークスペースのマウントと実行パスを確認する
- 04起動や対象選択が曖昧な状況に対処する
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ liaoann/ skills --skill devcontainer-execインストール後、Claude Code で/devcontainer-execを入力して読み込まれたか確認します。
同梱ファイルlifecycle.mdresolution.md
詳細
Devcontainer Exec
コンテナを一度特定したら、プロジェクトのコマンドはそのコンテナ経由で実行します。ソースがバインドマウントされている場合は、ホストで編集し、コンテナで実行します。.devcontainer/ ディレクトリは、プロジェクトの環境ポリシーを確認する目印であり、無関係なコンテナ作業を実行する理由ではありません。
ホスト:ファイルツール、git、gh、docker。コンテナ:インストール、ビルド、テスト、リント、型チェック、コード生成、マイグレーション、アプリの実行。
特定と検証
ROOT=$(git rev-parse --show-toplevel 2>/dev/null || pwd)
docker ps --filter "label=devcontainer.local_folder=$ROOT" --format '{{.ID}}\t{{.Names}}'
VS Code と devcontainer CLI は、このラベルをコンポーズのサイドカーではなく、開発コンテナに設定します。完全一致するものがない場合は、resolution.md を読んでください。複数一致する場合は、推測せず、必ず確認してください。バインドマウントを共有しているだけでは、同一である証明にはなりません。
選択したコンテナを調べます。
docker inspect -f '{{index .Config.Labels "devcontainer.metadata"}}' <container>
docker inspect -f '{{range .Mounts}}{{.Type}} {{.Source}} -> {{.Destination}}{{"\n"}}{{end}}' <container>
- ユーザー: 現在の
devcontainer.jsonに明示されたremoteUser/containerUser。それがなければメタデータフラグメント内の最後のremoteUser(なければcontainerUser)。それもなければ.Config.User。それもなければ root です。メタデータは JSON 配列、または古いコンテナではオブジェクトです。.Config.User がエディターのユーザーを反映しているとは限りません。root として実行すると、ホスト上のファイルが root 所有のままになることがあります。 - 作業ディレクトリ: リポジトリを含むバインドマウントから導出します:
Destination + (host_path − Source)。/workspaces/<repo>と決めつけたり、空の.Config.WorkingDirを信用したりしないでください。docker exec -u <user> -w <container_path> <container> lsで検証します。 - ボリュームが裏付けるワークスペース: 停止して報告します。ホスト側のコピーは、コンテナにおける信頼できるソースではありません。
実行
docker exec -i -u <user> -w <container_path> <container> bash -lc '<command>'
非 TTY ツールでは -t ではなく -i を使用します。環境変数は -e KEY=value で渡し、コンテナ内の相対パスを使用します。パイプライン全体は、1 つのシェルコマンドとして引用符で囲みます。長時間実行されるコマンドも docker exec 経由で実行します。
シェル/PATH の解決に失敗した場合は、resolution.md を読んでください。コンテナが消失または停止した場合は再特定します。コマンドごとに再特定する必要はありません。
ライフサイクルと安全上の境界
実行中のコンテナがない場合、またはコンテナの起動、作成、停止、削除が必要な場合は、操作する前に lifecycle.md を読んでください。ホストでの実行に切り替えないでください。環境の変更や永続的な影響を伴うコマンドを実行する前に、承認を得てください。コンテナでの実行は、テストの隔離を保証するものでも、本番環境へのアクセスを許可するものでもありません。
そのコンテナを明示した承認なしに、コンテナを削除してはいけません。agent の所有者ラベルは削除の権限を与えるものではなく、排他的に使用されている証明にもなりません。エディターがコンポーズコンテナを共有していることがあります。
出力
最初のプロジェクトコマンドを実行する前に、一度だけ報告します。
Devcontainer: <name> (<short-id>)
Workspace: <host_path> → <container_path>
Exec: docker exec -i -u <user> -w <container_path> <name> bash -lc '<cmd>'
完了条件
すべてのプロジェクト実行で、検証済みのコンテナ、ユーザー、ワークスペースを使用したか、コマンドを一切実行せずにブロッカーを明示していること。ホストでの代替実行、曖昧な対象の選択、ボリュームに基づくソースの不一致、未承認のコンテナ削除が発生していないこと。