Skip to content

feat(volume): VS Code Server をコンテナ再作成をまたいで保つ (PLAN36) - #131

Merged
takemi-ohama merged 1 commit into
mainfrom
feature/PLAN36-vscode-server-persistence
Aug 31, 2026
Merged

takemi-ohama merged 1 commit into
mainfrom
feature/PLAN36-vscode-server-persistence

Conversation

@takemi-ohama

Copy link
Copy Markdown
Contributor

Pull Request

概要

~/.vscode-server はコンテナ層(揮発)にあり、devbase up の down → up で消えます。
VS Code を attach するたびに 215MB の再ダウンロード(約 55 秒)と拡張機能の再インストールが走っていました。

コンテナ 1 つにつき 1 本の named volume devbase_vscode_<project>_<index> を ~/.vscode-server へ
マウントし、本体・拡張機能・接続トークンをプロジェクトの寿命で保ちます。

共有せずコンテナ単位にするのは、VS Code Server が「1 マシン 1 セット」の状態
(data/Machine/.connection-token-<commit>・各種 marker・ログ)を持つためです。
名前にプロジェクト名とインスタンス番号の両方を含めるので、scale > 1 の同時 attach でも
別プロジェクトの同時起動でも状態が混ざりません。

計画: issues/PLAN36_vscode-server-persistence.md

関連 Issue

  • なし(PLAN36)

変更点

  • lib/devbase/volume/manager.py — devbase_vscode_<project>_<index> の名前解決(get_vscode_volume_for)と、ensure_volumes での scale 分の作成。プロジェクト名は devbase up と同じ get_project_name() に委ね、作る側とマウントする側で名前がずれないようにした
  • lib/devbase/volume/compose.py — dev インスタンスごとのマウント追加と volumes: への external: true 宣言。プロジェクトが自分で ~/.vscode-server を書いている場合は上書きせず、その分の宣言も出さない
  • containers/base/entrypoint.sh — 空の named volume は root 所有で作られるため、devbase_setup_vscode_server_dir で所有者を初期化(既存の devbase_ensure_persistent_root を再利用)
  • docs/user/container-operations.md / docs/user/troubleshooting.md / CHANGELOG.md — ボリューム構造の表、掃除手順、attach で毎回ダウンロードが走るときの切り分け

やらないこと

  • VS Code 本体の更新時(commit ハッシュが変わるとき)の再取得をなくすこと。削減対象は再作成のたびの再取得
  • ~/.vscode-server 以外のホームディレクトリの永続化
  • ボリュームの掃除コマンドの追加(今回は手順のドキュメント化まで)

動作確認

  • uv run pytest が green(1699 passed)
  • 実プロジェクトの compose.yml(carmo-ai, scale=2)で生成 compose にマウントと external 宣言が出ることを確認
  • devbase container build --no-cache 後の実機で down → up → attach に再ダウンロードが無いこと(AC1 / AC2)
  • scale=2 の同時 attach で双方が動くこと(AC3)
  • 2 プロジェクトの同時起動で data/Machine を奪い合わないこと(AC4)
  • 新規プロジェクトの初回 attach が権限エラーにならないこと(AC5)
  • 必要に応じてドキュメント (docs/) を更新した

補足

反映にはベースイメージの再ビルドが要ります(devbase container build --no-cache)。
entrypoint の変更は devbase up だけでは反映されません。

既存コンテナは初回だけ 1 度ダウンロードが走り、以後は再利用されます。
ボリュームは devbase down でも残るため、使わなくなったプロジェクトの分は
docker volume ls --filter name=devbase_vscode_ から手で削除します(手順はドキュメントに記載)。

スナップショット(devbase snapshot)は devbase_home_* だけを対象にしているため、
このボリュームは対象外です。失っても attach し直せば再取得されます。

~/.vscode-server はコンテナ層 (揮発) にあり、devbase up の down → up で消える。
本体 bin/<commit> だけで 644MB あり、attach のたびに 215MB の再ダウンロードと
拡張機能の再インストールが走っていた。

コンテナ 1 つにつき 1 本の named volume devbase_vscode_<project>_<index> を
~/.vscode-server へマウントして再作成をまたいで保つ。共有せずコンテナ単位に
するのは、VS Code Server が「1 マシン 1 セット」の状態 (接続トークン・marker・
ログ) を持ち、複数コンテナが同時に書くと奪い合うため。

- ボリューム名の解決と作成 (Task 1)
- 生成 compose へのマウントと external 宣言 (Task 2)
- 空ボリュームは root 所有で作られるため entrypoint で所有者を初期化 (Task 3)
- ボリューム構造と掃除手順のドキュメント (Task 4)

プロジェクトが自分で ~/.vscode-server をマウントしている場合は上書きしない。
反映にはベースイメージの再ビルドが要る。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011xLj5TxPqwHV4Y7YYuptrQ

@takemi-ohama takemi-ohama left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 cross-review | round 1 | codex | APPROVE

修正必須の指摘はありません。

@takemi-ohama takemi-ohama left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 cross-review | round 1 | gemini | APPROVE

変更内容を確認しました。VS Code Server をコンテナごとに永続化するボリューム管理・マウント処理が正しく実装されており、指摘事項はありません。

@takemi-ohama
takemi-ohama merged commit 9275d68 into main Aug 31, 2026
5 checks passed
@takemi-ohama
takemi-ohama deleted the feature/PLAN36-vscode-server-persistence branch August 31, 2026 06:08
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant