ローカル開発
このページは、リポジトリをクローンし、イメージをローカルでビルドしたり、Dockerfileをカスタマイズしたい開発者向けです。ビルド済みコンテナを使用するだけの場合は、はじめにを参照してください。
リポジトリのクローン
Section titled “リポジトリのクローン”git clone https://github.com/f5-sales-demo/devcontainer.gitcd devcontainerプロジェクト構造
Section titled “プロジェクト構造”.├── Dockerfile # Multi-stage image build├── docker-compose.yml # Base compose — pulls pre-built image├── docker-compose.build.yml # Build override — use explicitly with -f├── .devcontainer/ # VS Code Dev Container config│ └── devcontainer.json├── entrypoint.sh # Container startup script├── .env.example # Example environment variables├── docs/ # Documentation site (Starlight)├── claude-config/ # Claude Code configuration files├── codex-config/ # Codex configuration├── pi-config/ # Pi configuration└── omp-config/ # Oh-My-Pi (omp) configurationビルドファイル
Section titled “ビルドファイル”docker-compose.build.yml ファイルはローカルビルドサポートを追加します。これは自動マージされません — -f フラグで明示的に渡す必要があります。つまり、docker compose up -d(または podman-compose up -d)は、リポジトリをクローンしたかどうかに関わらず、常にGHCRからビルド済みイメージをプルします。
プレーンな docker compose up がビルド済みイメージのみを使用する(build: コンテキストなし)ことを確認できます:
docker compose config明示的なビルド設定と比較してください:
docker compose -f docker-compose.yml -f docker-compose.build.yml configプレーンな podman-compose up がビルド済みイメージのみを使用する(build: コンテキストなし)ことを確認できます:
podman-compose config明示的なビルド設定と比較してください:
podman-compose -f docker-compose.yml -f docker-compose.build.yml configローカルビルド
Section titled “ローカルビルド”docker compose -f docker-compose.yml -f docker-compose.build.yml up -d --buildpodman-compose -f docker-compose.yml -f docker-compose.build.yml up -d --buildこれにより、ビルドファイルがベースのcomposeファイルとマージされ、ローカルの Dockerfile からイメージがビルドされ、コンテナが起動します。--build フラグは、キャッシュされたイメージが存在する場合でも強制的にリビルドします。
2ステージビルドアーキテクチャ
Section titled “2ステージビルドアーキテクチャ”DockerfileはDockerレイヤーキャッシュに最適化された2ステージビルドを使用します:
ステージ 1: deps(安定した基盤、約4.5 GB)
Section titled “ステージ 1: deps(安定した基盤、約4.5 GB)”これらのレイヤーは、バージョンARGが更新されるかAPTパッケージが変更された場合にのみリビルドされます。一般的なツールのみの変更では、BuildKitはこのステージ全体をスキップします。
| セクション | 内容 |
|---|---|
| 1. APTリポジトリ | NodeSource、deadsnakes、HashiCorp、GitHub、Docker、Microsoft、Google Cloud、Dart SDK |
| 2. APTパッケージ | システムツール、Node.js、Python、Java、Terraform、GitHub CLI、Dockerエンジン、Azure CLI、PowerShell、ロケール |
| 2b. セキュリティAPTパッケージ | ネットワーク分析、Webスキャナー、パスワードツール、リバースエンジニアリング、フォレンジック(約80パッケージ) |
| 3. Pythonブートストラップ | シンボリックリンク + get-pip.pyによるpip |
| 4. Go | 公式tarball(ビルド時に解決される最新安定版) |
| 5. Rust | rustup(システム全体、最新安定版) |
| 6. Maven + Gradle | /opt へのバイナリダウンロード |
| 7. VNCスタック | Xvfb、x11vnc、noVNC、fluxbox — ブラウザ経由のリモートディスプレイ |
| 8. Nerdフォント | JetBrainsMono、Hack、FiraCode(最新リリース) |
ステージ 2: final(頻繁に変更されるツール + ユーザー設定、約1.5 GB)
Section titled “ステージ 2: final(頻繁に変更されるツール + ユーザー設定、約1.5 GB)”これらのレイヤーはより頻繁に変更されますが(npm/pipの更新、設定変更)、重い deps ステージがキャッシュされているため、素早くリビルドできます。
| セクション | 内容 |
|---|---|
| 9. AWS CLI v2 | 公式インストーラー |
| 10. バイナリツール | kubectl、helm、tflint、terraform-docs、act、actionlint、yt-dlp、uv |
| 10b. 追加バイナリ | VS Code CLI、oc、yq、terragrunt、ibmcloud、fzf、hadolint、codex |
| 10c. Super-linterバイナリ | shfmt、gitleaks、editorconfig-checker、trivy、clj-kondo、dotenv-linter、golangci-lint、goreleaser、kubeconform、protolint、scalafmt、ktlint |
| 10d. Java JARツール | checkstyle、google-java-format(ラッパースクリプト) |
| 10e. PHPリンター | phpcs、phpstan、psalm(PHARダウンロード) |
| 10f. PowerShellモジュール | PSScriptAnalyzer、arm-ttk |
| 10g. セキュリティバイナリ | nuclei、subfinder、httpx、ffuf、gobuster、feroxbuster、dalfox、amass、trufflehog、grype、syft、bettercap(amd64) |
| 10h. OWASP ZAP | Javaベースのウェブアプリケーションスキャナー |
| 10i. Ghidra | リバースエンジニアリングフレームワーク |
| 10j. Metasploit | エクスプロイトフレームワーク(amd64のみ) |
| 11. npmグローバルツール | claude-code、prettier、markdownlint-cli2、devcontainers-cli、playwright、pi-coding-agent、oh-my-pi |
| 12. pipツール | pre-commit、ansible、black、pylint、yamllint、playwright |
| 12c. Rubyリンター | rubocop + 拡張機能 |
| 12e. Perlリンターモジュール | Perl::Critic拡張機能 |
| 12f. Luaリンター | luacheck |
| 12g. Rリンター | lintr |
| 12h. セキュリティRuby gems | wpscan、evil-winrm |
| 12i. Gitクローンされたセキュリティツール | testssl.sh、exploitdb(searchsploit)、SecLists、docker-bench-security、recon-ng、spiderfoot |
| 13. Playwrightブラウザ | Chromium + playwright install --with-deps によるシステム依存関係 |
| 13b. Chrome DevTools MCP | Chromeシンボリックリンク + MCPプリキャッシュ + ヘッドレスパッチ |
| 14. Homebrew | Linuxbrew(AIアシスタント依存関係 + フォーマッター) |
| 15. ZSHプラグイン | oh-my-zshカスタムプラグイン |
| 16. シェルブートストラップ | npm-global、tfenv、compinit |
| 17. Claude Code + Codex設定 | ツール認識メモリ、管理ポリシー、セルフテストスクリプト、Codex設定 |
| 18. エントリポイント | コンテナ起動スクリプト(最後のCOPY) |
ツールの追加
Section titled “ツールの追加”Dockerfile を編集し、適切なセクションにツールを追加します。追加後にリビルドしてください:
docker compose -f docker-compose.yml -f docker-compose.build.yml up -d --buildpodman-compose -f docker-compose.yml -f docker-compose.build.yml up -d --buildまたはVS Codeで:Dev Containers → Rebuild Container。
APTパッケージ
Section titled “APTパッケージ”セクション2の apt-get install ブロックに追加します:
RUN apt-get update && apt-get install -y --no-install-recommends \ your-package-here \ && apt-get clean \ && rm -rf /var/lib/apt/lists/*npmツール
Section titled “npmツール”セクション11の npm install -g ブロックに追加します:
RUN npm install -g \ your-npm-toolpipツール
Section titled “pipツール”セクション12の pip install ブロックに追加します:
RUN pip install --no-cache-dir --break-system-packages \ your-python-toolバイナリダウンロード
Section titled “バイナリダウンロード”セクション10に追加するか、アーキテクチャ検出を含む新しい RUN レイヤーを作成します:
RUN ARCH=$(dpkg --print-architecture) \ && curl -fsSL "https://example.com/tool-linux-${ARCH}.tar.gz" \ | tar -xz -C /usr/local/bin toolビルドキャッシュ
Section titled “ビルドキャッシュ”CIはレジストリベースのキャッシュを使用します — ビルドレイヤーはGitHub Actionsキャッシュではなく、GHCR(ghcr.io/f5-sales-demo/devcontainer:cache-*)に保存されます。これにより、この約6 GBのマルチアーキテクチャイメージで頻繁なフルリビルドを引き起こしていた10 GBのGHAキャッシュ制限を回避できます。
2ステージアーキテクチャはレジストリキャッシュと連携して以下のように動作します:
- ツールバージョンの更新(npm、pip、バイナリツール)—
finalステージのみリビルド(約5分) - 設定ファイルの変更(
claude-config/、entrypoint.sh)— 最後の数レイヤーのみリビルド(約1分) - 基盤の変更(APTパッケージ、Go/Rust/Javaバージョン)— 両ステージのフルリビルド(約30分)