📦

開発者とAIのためのサンドボックスとしてのDevcontainer

に公開


Development with devcontainers


取り組みの背景

僕はサービスアーキテクチャを担当する基盤チームで働いています。役割のひとつとして、開発者や近年ではAIツールが、安全かつ一貫した形でコードベースに関わるための仕組みを設計しています。

その中で、次のような課題が繰り返し発生していました。

  • オンボーディングに時間がかかりすぎる
  • マシンごとに環境が乖離していく
  • プロジェクトの切り替えが煩雑
  • AIコーディングアシスタントが過剰な権限を持ってしまう

これらを解決するため、私たちは devcontainer の構築に着手しました。本記事では、導入した内容とその背景について紹介します。


目標

  • 誰でも同じように使える標準化された開発環境
  • 作業を失うことなく安全にリセットできる仕組み
  • AIエージェントをホストマシンから隔離
  • 新メンバーがすぐに生産的になれる環境

構築している内容

一貫した環境

バグ報告があった際に、誰でもすぐ再現できる状態を保ちたいと考えています。 個々の環境設定の違いをデバッグすることに時間を使いたくありません。AIエージェントも同様で、環境が予測可能であればあるほど、安定した動作が期待できます。

Devcontainer はワンクリックでセットアップ可能です。リポジトリをクローンし、VS Codeで開いて「Attach to Running Container」をクリックするだけで、全員が同じツール・同じバージョンの環境を利用できます。


VS Code prompts you to select which devcontainer to attach


Connected to container - pink title bar indicates which environment you're in


自動化されたセットアップ

私たちの環境では、コンテナ起動時に必要なものがすべて自動でインストールされます。

  • zsh / oh-my-zsh
  • バージョン管理ツール(anyenv、aqua)
  • CLIツール(GitHub、Google Cloud)
  • 標準のVS Code拡張機能

依存関係は毎回同じ順序でインストールされ、再現性が保たれます。何か問題が起きても、リセットすれば既知の状態に戻せます。また、他の作業に影響を与えることなく、個別にバージョンアップの検証も可能です。


Workspace ready with zsh, terminal, and VS Code Extensions


リカバリー前提の設計

以前、Cursorが許可なく .zshrc を変更するという出来事がありました。この経験から、AIツールのリスクを強く意識するようになりました。

ターミナルアクセスを持つAIエージェントは、本質的にシステムへ影響を与える力を持っています。しかしコンテナ内で実行すれば、最悪でも未保存のファイルが失われる程度に抑えられます。リセットして再構築すれば、そのまま作業を再開できます。

この設計により、新しい試みへの心理的ハードルも下がります。アップグレードで環境が壊れても、修復はコンテナのリセットだけで済み、長時間のデバッグに悩まされることはありません。


AIに対する境界線

サンドボックス化されていない状態では、高い権限を持つAIを信頼するしかありません。シェルスクリプトのわずかなミスが、深刻な問題を引き起こす可能性もあります。

コンテナを活用することで、リポジトリごとに権限の範囲を明確にできます。ドキュメント用リポジトリには柔軟な権限を与え、本番インフラは厳しく制限する、といった運用が可能です。

将来的には、MCPサーバーのような外部ツールとAIエージェントの連携も視野に入れています。コンテナに隔離された状態のまま、必要な外部サービスへのアクセスを安全に制御できます。


Rough outline of multi-environment usage utilizing AI agents


参入障壁を低く

始め方はシンプルです。

  1. リポジトリをクローン
  2. 設定を編集、もしくはデフォルトのまま使用
  3. devcontainer up
  4. コーディング開始

VS Codeに慣れていれば、それ以外はすべて自動化されています。プルリクエストの作成やレビューも拡張機能でスムーズに行えます。


ペアプログラミング対応

VS Code Live Shareを標準拡張機能として組み込んでいます。全員が同じコンテナを使用しているため、誰かの環境に参加するのも数秒で完了します。

オンボーディング、ペアデバッグ、ローカル環境を切り替えずに本番トラブルへ対応する場面などで大きな効果を発揮します。


現在の構成

機能の配布

devcontainer-features/
├── .github/
├── src/
│   ├── coreutils/
│   │   ├── scripts/
│   │   ├── devcontainer-feature.json
│   │   ├── install.sh
│   │   └── README.md
│   ├── desktop/
│   └── vnc/
└── README.md

機能はGitHub Container Registryで配布されます。チームは標準化されたツールを自動的に取得できます。


Deployment to a private Github Registry

ローカルフォルダ

~/devcontainer-repo              # 設定
~/.dev/devcontainers             # 永続的な作業ディレクトリ
~/.dev/certs                     # ローカルHTTPS用のTLS証明書

各コンテナはDocker-in-Dockerで動作するため、マイクロサービススタックはホストに触れずにコンテナ内で実行されます。Portainerで各環境内の稼働状況を可視化しています。


Portainer showing host (local) + 3 devcontainer environments (d1, d2, d3)


Dashboard inside d1 devcontainer: 2 stacks, 7 containers running


devcontainer.jsonの例

{
  "name": "Ubuntu DevContainer",
  "dockerComposeFile": "docker-compose.yml",
  "remoteUser": "vscode",
  "forwardPorts": ["80", "443", "3000", "8080"],

  "features": {
    "ghcr.io/devcontainers/features/common-utils:2": {
      "installZsh": true,
      "installOhMyZsh": true
    。。。
    },
    "ghcr.io/devcontainers/features/go:1": { "version": "1.25" },
    "ghcr.io/devcontainers/features/node:1": { "version": "22" },
    "ghcr.io/devcontainers/features/docker-in-docker:2": {
      "installDockerBuildx": true
    。。。
    },
    "ghcr.io/my-org/devcontainer-features/coreutils:1": {
      "installAnyenv": true,
      "installAqua": true,
      "installPortainerAgent": true
    。。。
    }
  },

  "customizations": {
    "vscode": {
      "extensions": [
        "GitHub.vscode-pull-request-github",
        "ms-vsliveshare.live-share",
        "golang.go",
        "ms-vscode.vscode-typescript-next",
        "dbaeumer.vscode-eslint",
        "esbenp.prettier-vscode",
        "hashicorp.terraform",
        "googlecloudtools.cloudcode",
        "anthropic.claude-code",
        "saoudrizwan.claude-dev",      // cline
        "ms-azuretools.vscode-docker"
        。。。
      ]
    }
  },
  
  "workspaceFolder": "/home/vscode/workspaces",
  "postStartCommand": "bash ~/workspaces/scripts/post-start.sh"
}

完了している項目

  • 環境のブートストラップ
  • ツールチェーンのインストール
  • バージョン管理ツール
  • 拡張機能と設定
  • ネストされたDocker
  • Traefik Proxy(仮DNS付き)
  • ACME TLS Challenge

進行中の項目

  • DNS
  • パフォーマンスチューニング
  • シークレット管理
  • AI制約の強化
  • Codespaces連携

なぜこれが重要か

最終的なゴールは、ホストシステムにリスクを与えることなく、AIが開発者と並走して働ける環境を実現することです。その基盤となるのがコンテナです。

「自分の環境では動くのに、他の人では動かない」といった環境差によるトラブルを根本からなくします。コンテナをリセットした状態で動かないものは、どこでも動かない。それが新しい前提です。


現在の状況

社内展開を開始したばかりですが、すでに以下の成果が得られています。

  • 依存関係が競合するタスクを並行実行できる(VS Codeウィンドウを2つ開くだけ)
  • マイクロサービススタックを安全に一時停止・再開できる
  • ペアプログラミングを即座に開始できる

将来的には、僕の brew list に残るのはコンテナ関連ツールと個人用アプリのみになるでしょう。それ以外はすべてサンドボックスの中へ。


Multiple devcontainers running simultaneously on host


Multiple devcontainers paused while I attend a zoom meeting

おわりに

クロステック・マネジメント社は、「教育×AI」で次世代の学びを創造するために生まれた芸術大学発のスタートアップです。
ご興味のある方は、ぜひお気軽にお問い合わせいただけると嬉しいです!

https://www.wantedly.com/companies/company_7297732

クロステックマネジメント(京都芸術大学)

Discussion