feat(volume): VS Code Server をコンテナ再作成をまたいで保つ (PLAN36) - #131
Merged
Merged
Conversation
~/.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
commented
Aug 31, 2026
takemi-ohama
left a comment
Contributor
Author
There was a problem hiding this comment.
🤖 cross-review | round 1 | codex | APPROVE
修正必須の指摘はありません。
takemi-ohama
commented
Aug 31, 2026
takemi-ohama
left a comment
Contributor
Author
There was a problem hiding this comment.
🤖 cross-review | round 1 | gemini | APPROVE
変更内容を確認しました。VS Code Server をコンテナごとに永続化するボリューム管理・マウント処理が正しく実装されており、指摘事項はありません。
2 tasks
7 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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
変更点
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 で毎回ダウンロードが走るときの切り分けやらないこと
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)data/Machineを奪い合わないこと(AC4)docs/) を更新した補足
反映にはベースイメージの再ビルドが要ります(
devbase container build --no-cache)。entrypoint の変更は
devbase upだけでは反映されません。既存コンテナは初回だけ 1 度ダウンロードが走り、以後は再利用されます。
ボリュームは
devbase downでも残るため、使わなくなったプロジェクトの分はdocker volume ls --filter name=devbase_vscode_から手で削除します(手順はドキュメントに記載)。スナップショット(
devbase snapshot)はdevbase_home_*だけを対象にしているため、このボリュームは対象外です。失っても attach し直せば再取得されます。