devbase のコンテナ管理機能について、ライフサイクル、並行開発、ボリューム構造、イメージ階層を解説します。
コマンド体系について: コンテナ操作は
devbase project <sub>グループ(および トップレベルショートカットdevbase up等)で行います。旧devbase container <sub>は 非推奨となり、projectへのエイリアスとして警告付きで当面動作します。projectではup/down/ps/logs/scale/rebuild/openに[name]を指定することで 任意のディレクトリから 対象プロジェクトを操作できます。profile up/profile down/profile listも[name]を取りますが、ラッパーでは位置で解決できず Python 側が解決する 点が違います。プロジェクト一覧はdevbase project listを参照 してください。詳細は CLI リファレンス: project グループ を参照。
devbase のコンテナは以下のライフサイクルで管理されます。
stateDiagram-v2
[*] --> ビルド: devbase build
ビルド --> 停止: イメージ作成完了
停止 --> 起動中: devbase up
起動中 --> 起動中: devbase login
起動中 --> 停止: devbase down
停止 --> 起動中: devbase up
note right of 起動中
up 時にスナップショット自動作成
end note
note right of 停止
down 時にローテーション自動実行
end note
# 1. コンテナイメージをビルド(初回のみ)
devbase build
# 2. コンテナを起動(自動スナップショット作成)
devbase up
# 3. コンテナにログイン
devbase login
# 4. コンテナ内で作業
# ...
# 5. コンテナから退出
exit
# 6. コンテナを停止・削除(自動ローテーション)
devbase downコンテナのライフサイクルに連動して、スナップショットが自動管理されます。
| タイミング | 動作 | 条件 |
|---|---|---|
devbase up |
フルバックアップ or 差分追加 | 起動するアカウントグループの系列の最新の世代へ差分を追加。系列に世代が無いか差分が上限に達していればフルバックアップで新しい世代 |
devbase down |
古い世代のローテーション | グループ(系列)ごとに DEFAULT_MAX_GENERATIONS(3)を超えた世代と、全体の上限(9)を超えた古い世代を削除。各系列の最新の世代は残す |
詳細は スナップショットガイド を参照してください。
devbase は複数のコンテナを同時に起動し、並行開発を行うことができます。
プロジェクトの project.yml で scale を設定します。デフォルト値は 2 です。
version: 1
scale: 2
repos:
- owner: your-org
repo: my-repo起動中のコンテナを再起動せずに、コンテナ数を変更できます。
# コンテナを3台に増やす(既存コンテナは再起動しない)
devbase project scale 3
# コンテナを1台に減らす
devbase project scale 1
# 任意のディレクトリから adminer を3台に
devbase project scale adminer 3コンテナ番号を指定してログインします。
# 1番目のコンテナにログイン
devbase login 1
# 2番目のコンテナにログイン
devbase login 2
# 3番目のコンテナにログイン
devbase login 3graph LR
subgraph ホストマシン
A[ターミナル 1]
B[ターミナル 2]
end
subgraph devbase
C[コンテナ 1<br/>/work 専用]
D[コンテナ 2<br/>/work 専用]
E[共通AI設定<br/>/persistent/ai]
F[グループ別の認証・履歴<br/>/persistent/group]
end
A --> C
B --> D
C --> E
D --> E
C --> F
D --> F
- 各コンテナは独立した
/workボリュームを持つ /persistent/ai(共通の AI 資産・共有ファイル)は全コンテナで共有される/persistent/group(認証情報・会話履歴)は同じアカウントグループのコンテナだけで共有される/home/ubuntu直下のうち永続化されるのは symlink 対象のみ(下記「AI 設定の永続化」参照)- 異なるブランチでの並行作業に便利
devbase のコンテナは 4 種類のボリュームを使用します。
| ボリューム名 | マウント先 | 共有範囲 | 用途 |
|---|---|---|---|
devbase_home_ubuntu |
/persistent/ai |
全コンテナで共有 | 契約やテナントに紐づかない共通資産(~/.claude/plugins / skills / commands / CLAUDE.md / settings.json、.codex / .serena / .kiro、SSH 鍵、共有ファイル置き場 share) |
devbase_home_{group} |
/persistent/group |
同じアカウントグループのコンテナで共有 | 企業テナントに紐づくもの(Claude Code の認証と会話ログ、.gemini、Kiro CLI の .local/share/kiro-cli、gcloud / gws の設定ディレクトリ、作り直しても残るシェルの設定の置き場所 .shellrc.d) |
devbase_work_{index} |
/work |
同じ index のコンテナで共有(プロジェクト間も共有) | プロジェクトのソースコード、作業ファイル |
devbase_vscode_{project}_{index} |
/home/ubuntu/.vscode-server |
共有しない(コンテナ 1 つに 1 本) | VS Code Server 本体・拡張機能・接続トークン |
Note:
devbase_home_ubuntuは/persistent/aiにマウントされます(/home/ubuntuへの直接マウントは廃止)。/home/ubuntu直下はコンテナ層(揮発)で、永続化されるのは entrypoint が/persistent/ai//persistent/group配下へ symlink する設定ファイルのみです。シェル履歴など symlink 対象外のファイルは再生成で失われます。
devbase_home_{group} の {group} は DEVBASE_ACCOUNT_GROUP で宣言します。
使用する Google / AWS アカウントの単位で、未設定なら default です。
# projects/<name>/env
DEVBASE_ACCOUNT_GROUP=kkgこれは「nyle.co.jp で認証した gcloud を kk-generation.com のプロジェクトが引き継がない」
ようにするための仕切りです。同じグループのコンテナは認証を共有し、違うグループのコンテナは
互いの認証に到達できません。一方で ~/.claude/plugins(238MB)のような共通資産は
/persistent/ai に置かれるため、グループを増やしても重複しません。
いま自分がどのグループにいるかは devbase status の [環境] セクションで確認できます。
[環境]
devbase/.env 42変数 (最終更新: 2026-08-29)
アカウントグループ kkg (devbase_home_kkg / env)
末尾の env / 既定 は、値が env 由来か未設定によるフォールバックかを示します。
グループ名には次の 3 つが使えません。devbase up の前にエラーになります。
| 使えない名前 | 理由 |
|---|---|
^[a-zA-Z0-9][a-zA-Z0-9._-]*$ に合わないもの |
Docker のボリューム名にできない |
ubuntu |
共通ボリューム devbase_home_ubuntu と同名になる |
数字だけの名前(1 / 042) |
インスタンス番号のボリューム devbase_home_<index> と同名になる |
Google 認証の具体的な手順は Google 認証ガイド を参照してください。
VS Code を attach すると、コンテナ内に VS Code Server(本体 bin/<commit>・拡張機能・
接続トークン)が入ります。ここは ~/.vscode-server で、以前はコンテナ層(揮発)にあったため
devbase up でコンテナを作り直すたびに 215MB の再ダウンロード(約 55 秒)が走っていました。
現在は devbase_vscode_{project}_{index} を ~/.vscode-server にマウントするため、
コンテナを作り直しても本体と拡張機能が残ります。
このボリュームだけは共有しません。VS Code Server は「1 マシン 1 セット」の状態
(data/Machine/.connection-token-<commit> など)を持ち、複数のコンテナが同時に書くと
接続トークンを奪い合うためです。名前にプロジェクト名とインスタンス番号の両方を含めることで、
scale > 1 の同時 attach でも、別プロジェクトの同時起動でも状態が混ざりません。
- 初回 attach と VS Code 本体のバージョン更新時(
commitハッシュが変わるとき)は ダウンロードが走ります。減るのはコンテナ再作成のたびの再取得です - プロジェクトが
compose.ymlで~/.vscode-serverを自分でマウントしている場合、 devbase は上書きしません - スナップショット(
devbase snapshot)の対象外です。失っても attach し直せば再取得されます
- ボリュームは
devbase downでもコンテナが削除されても保持されます - コンテナの再起動(
devbase up)で同じボリュームが再マウントされます - ボリュームを明示的に削除するには
docker volume rmを使用します
Warning:
devbase_work_{index}はCOMPOSE_PROJECT_NAMEの接頭辞が付かない external ボリュームです。同じ index(コンテナ 1 ならdevbase_work_1)を使う限り 別プロジェクトからも同じ実体を参照するため、docker volume rm devbase_work_1は停止中の他プロジェクトの作業ファイルまで削除します。削除前にdocker ps -a --filter volume=devbase_work_1で利用コンテナを確認してください。
# Docker ボリュームの一覧
docker volume ls | grep devbase
# 特定ボリュームの詳細
docker volume inspect devbase_home_ubuntudevbase_vscode_* はプロジェクトを削除しても自動では消えません。attach したコンテナ 1 つ
あたり 約 1.6GB を使うため、使わなくなったプロジェクトの分は手で削除します。
# 一覧(サイズ付き)
docker volume ls --filter name=devbase_vscode_ --format '{{.Name}}'
docker system df -v | grep devbase_vscode_
# 使用中のコンテナが無いことを確認してから削除する
docker ps -a --filter volume=devbase_vscode_<project>_1
docker volume rm devbase_vscode_<project>_1削除しても失われるのは VS Code Server のキャッシュだけです。次の attach で再取得され、
設定(~/.claude などの AI 設定)には影響しません。稼働中のコンテナが掴んでいるボリュームは
docker volume rm が拒否するので、先に devbase down してください。
Warning:
devbase_home_ubuntuボリューム(/persistent/ai、および symlink 経由でアクセスする~/.claude/plugins/~/share等)は全プロジェクトで共有されます。ここにプロジェクト固有のファイルを置くと、他のプロジェクトにも影響します。プロジェクト固有のファイルは/workに配置してください。
AI CLI ツールの設定や認証情報は、コンテナを再生成しても保持されるよう 2 つのボリュームに永続化されます。
仕組みは symlink です。コンテナ起動時、entrypoint(containers/base/entrypoint.sh)が
以下の各エントリについて symlink を作成します。
全コンテナ共通(/persistent/ai)
| エントリ | 内容 |
|---|---|
.codex |
Codex CLI の設定(ChatGPT アカウントで分離済み) |
.serena |
Serena MCP の設定 |
.kiro |
Kiro CLI の設定(AWS 側で分離済み) |
.ssh |
SSH 鍵 |
share |
全コンテナ共有のファイル置き場(任意用途) |
.claude/plugins .claude/skills .claude/commands .claude/CLAUDE.md .claude/settings.json |
Claude Code の共通資産 |
アカウントグループ単位(/persistent/group)
| エントリ | 内容 |
|---|---|
.claude.json |
Claude Code の設定(oauthAccount を含む) |
.claude |
Claude Code の認証・会話ログ・セッション状態(上表の共通資産を除くすべて) |
.gemini |
Gemini CLI と Antigravity CLI の設定(vertex-ai は GCP プロジェクトに紐づく。Antigravity CLI は .gemini/antigravity-cli/ 配下を使う) |
.local/share/kiro-cli |
Kiro CLI 2.x の認証状態・実行データ |
.shellrc.d |
対話シェルが起動時に読む *.sh の置き場所。パスは DEVBASE_SHELLRC_DIR が示す。反映には devbase build base --no-cache が要る(作り直しても残るシェルの設定) |
~/.claude は /persistent/group/.claude への symlink で、その配下の既定はグループ側です。
共通資産だけがその中から /persistent/ai/.claude/<name> へ張り直されます。既定をグループ側に
倒しているのは、Claude Code が projects / sessions / tasks のようなディレクトリを随時作るため、
永続化するものを列挙する方式だと列挙漏れが黙って揮発するからです。
$ readlink -f ~/.claude # グループ側
/persistent/group/.claude
$ readlink -f ~/.claude/plugins # 共通側(どのグループから見ても同じ実体)
/persistent/ai/.claude/plugins/persistent/aiは全コンテナ共通のdevbase_home_ubuntuボリュームなので、どのコンテナからも同じ実体を参照します(例:~/shareは全コンテナで共有)。/persistent/groupはdevbase_home_{group}で、同じアカウントグループのコンテナだけが同じ実体を参照します。- symlink 対象外のホーム配下ファイル(シェル履歴など)はコンテナ層に置かれ、再生成で失われます。永続化したいものは
/persistent/ai//persistent/group配下(= 上記 symlink 先)か/workに置いてください。
default グループでは、初回起動時に /persistent/ai にある分類 B のデータ
(.claude.json / 認証 / 会話ログ / .gemini)が /persistent/group へコピーされます。
そのため既存環境で Claude Code の再ログインは発生しません。
- コピーであって移動ではないので、切り戻すときは元データがそのまま残っています
- 実行されるのはグループ側にまだ実体が無いときだけです(2 回目以降は何もしません)
- 実測で 1.3GB 程度あるため初回だけ起動が伸びます
- 非
defaultグループではシードしません(分離の意味が失われるため) gcloud/gwsはシード元が存在しないため、defaultを含む全グループで初回 1 回の認証が必要です
起動ログの 1 行で、どのグループとしてどのアカウントで動いているかを確認できます。
Account group: kkg (gcloud account: someone@kk-generation.com, CLOUDSDK_CONFIG: /persistent/group/gcloud)
share配下に置いた VS Code ワークスペースファイルはDEVBASE_WORKSPACEで開けます(リポジトリ 1 件の構成のみ。環境変数 参照)。
Note: symlink 対象は entrypoint にビルド時
COPYで焼き込まれます。エントリを増減した場合は イメージの再ビルドが必要です(devbase up単体では反映されない場合があります。CLI リファレンス: project グループ のdevbase project upの注記参照)。
gcloud と gws は symlink ではなく 環境変数で設定ディレクトリごと差し替えています。
| 変数 | 向き先 | 入るもの |
|---|---|---|
CLOUDSDK_CONFIG |
/persistent/group/gcloud |
credentials.db / access_tokens.db / legacy_credentials/ / configurations/ / application_default_credentials.json(ADC ファイル) |
GOOGLE_WORKSPACE_CLI_CONFIG_DIR |
/persistent/group/gws |
credentials.enc / .encryption_key |
CLOUDSDK_CONFIG は gcloud CLI 専用の仕組みではなく google.auth の探索経路そのものなので、
BigQuery クライアント等のライブラリも同じ場所を見ます。
Warning: この差し替えにより、
~/.config/gcloudは gcloud の設定ディレクトリでは なくなりました。鍵モード(GCP_AUTH_MODE=key)で書き出されるサービスアカウント鍵の 置き場でしかなく、コンテナ層(揮発)に残ります。したがって鍵は毎起動envから書き直され、 永続領域には残りません。設定を見たいときは$CLOUDSDK_CONFIGを参照してください。
認証モードの切り替えは 環境変数ガイド の GCP_AUTH_MODE、
実際の認証手順は Google 認証ガイド を参照してください。
Warning: gcloud は並行実行を想定していません(公式ドキュメント: "Parallel execution of multiple gcloud CLI commands is not supported.")。
credentials.dbは SQLite なので、 同じアカウントグループの複数コンテナが同時にgcloudを叩くとdatabase is lockedが 出ることがあります。恒久対策は取っていないので、その場合は少し待って再実行してください。
devbase のコンテナイメージは用途に応じた階層構造になっています。
graph TD
A[Ubuntu 26.04] --> B[base]
B --> C[general]
B --> G[go]
C --> D[php]
C --> I[php85]
C --> E[latex]
C --> F[lfm]
A --> H[snapshot]
style A fill:#f0f0f0
style B fill:#e8e8f4
style C fill:#e8f4e8
style G fill:#f4f0e8
style H fill:#f4e8e8
| イメージ | ベース | 主な内容 | 用途 |
|---|---|---|---|
| base | Ubuntu 26.04 | Docker CLI、Python 3、日本語フォント、PDF / OOXML の道具、shellcheck | 最小限の開発環境 |
| general | base | AWS CLI、gcloud、Terraform、Node.js 20、AI CLI | 汎用開発環境 |
| php | general | PHP 8.5、Composer、MySQL Shell | PHP 8.5 系 開発 |
| php85 | general | PHP 8.5、Composer、MySQL Shell | PHP 8.5 系 開発 |
| latex | general | LaTeX | 文書作成 |
| lfm | general | Rust、gfortran、MeCab | 数値計算・自然言語処理 |
| go | base | Go 開発環境 | Go 開発 |
| snapshot | Ubuntu 26.04 | zstd のみ(約 80MB) | スナップショット専用 |
base イメージは、文字を描くときの既定を日本語にしています。総称ファミリ(sans-serif /
sans / serif / monospace)と、イメージに無い書体名(Meiryo / Yu Gothic /
MS PGothic / Noto Sans JP など)は、いずれも Noto CJK の JP フェイスへ解決されます。
fontconfig は Chromium / Playwright のスクリーンショット、PDF の生成、画像の生成がすべて
参照するため、日本語を含むページを撮っても日本語の字形で写ります。
| 指定 | 解決先 |
|---|---|
sans-serif / sans |
Noto Sans CJK JP |
serif |
Noto Serif CJK JP |
monospace |
Noto Sans Mono CJK JP |
Arial / Times New Roman / Courier New |
Liberation Sans / Serif / Mono(metric 互換) |
Calibri / Cambria |
Carlito / Caladea(metric 互換) |
sans-serif:lang=zh-cn など、言語を明示した指定 |
その言語の、同じ様式のフェイス(SC / KR) |
言語を明示しない中国語は、日本語の字形で描かれます。
langを伴わないsans-serifは どちらかの言語を選ばざるをえないためで、意図した振る舞いです。中国語・韓国語で描きたい ときはlang=zh-cn/lang=koを明示するか、書体を名指ししてください。
設定は /etc/fonts/local.conf(containers/base/fonts-local.conf)にあります。個人の設定
~/.config/fontconfig/fonts.conf はこれより先に読まれるため、コンテナの中で上書きできます。
文書を扱う道具も base に入っています。
| 道具 | 用途 |
|---|---|
pdftoppm / pdftocairo |
PDF を画像(PNG / JPEG / SVG)にする |
pdfinfo / pdffonts |
PDF のページ数・寸法・埋め込みフォントを調べる |
python3 -c "import PIL" |
画像の読み書き・変換(Pillow) |
python3 -c "import lxml, defusedxml" |
OOXML(.docx / .xlsx / .pptx)を壊さずに読み書きする |
LibreOffice と
pipは入っていません。 LibreOffice は展開 372〜459MB で base の規律に 見合わないため入れていません。Python パッケージが要るときはuv/uvxを使ってください。
これらは
devbase build base --no-cacheで base を建て直すと反映されます。devbase upだけでは反映されません。派生イメージ(generalなど)を使っている プロジェクトは、その派生イメージも建て直してください。devbase rebuildでは建て直りません。devbase build --expires=7のシノニムのため、 期限内はビルドそのものを飛ばします。
規則の中身と、その置き場所を動かせない理由は base イメージの文字の描画と、文書を扱う道具 にあります。
base イメージには ShellCheck(shellcheck)が入っています。
コンテナの中で Bash スクリプトを検査できます。
shellcheck path/to/script.sh指摘は SC2086 のような番号つきで出て、指摘があれば終了コード 1 で終わります。
bash-language-server などの言語サーバは Bash の診断を shellcheck に任せているため、
コンテナの中で言語サーバを動かすときもこれが使われます(言語サーバ自体は base に入っていません)。
版は固定しておらず、base を建てた時点の Ubuntu のアーカイブの版が入ります。
containers/lfm と containers/snapshot は base を継がないため入っていません。
置き場所・入れ損ないの止め方・版の扱いの仕様は
base イメージの Bash の静的検査(shellcheck)
にあります。
devbase build base --no-cacheで base を建て直すと反映されます。devbase upだけでは 反映されません。派生イメージ(general/phpなど)を使っているプロジェクトは、その 派生イメージも建て直し、稼働中のコンテナはdevbase down→devbase upで作り直して ください。devbase rebuildでは建て直りません。
general イメージ以降のコンテナ内では、以下の AI CLI ツールがエイリアスとして利用可能です。
| エイリアス | ツール | モード | 説明 |
|---|---|---|---|
claude |
Claude Code | skip-permissions | Anthropic の AI コーディングアシスタント |
claudb |
Claude Code (AWS Bedrock) | Opus 4.6 / us-west-2 | AWS Bedrock 経由の Claude |
gemini |
Gemini CLI | yolo mode | Google の AI アシスタント |
codex |
Codex CLI | bypass-approvals | OpenAI の AI コーディングツール |
kiro |
Kiro CLI | trust-all-tools | AWS の AI アシスタント |
agy |
Antigravity CLI | dangerously-skip-permissions | Google の AI コーディングエージェント |
# コンテナ内での使用例
claude "このコードをレビューして"
gemini "テストを書いて"
codex "リファクタリングして"コンテナの対話シェルでは、各 AI CLI が確認プロンプトを省くオプション付きで起動します。
定義は /etc/devbase/ai-cli-aliases.sh にあり、~/.bashrc から読み込まれます。
| コマンド | 起動するもの |
|---|---|
claude |
claude --dangerously-skip-permissions |
claudb |
claude --dangerously-skip-permissions(Amazon Bedrock 経由。CLAUDE_CODE_USE_BEDROCK=1 / AWS_REGION=us-west-2 を前置) |
gemini |
gemini --yolo |
codex |
codex --dangerously-bypass-approvals-and-sandbox |
kiro |
kiro-cli chat --trust-all-tools |
agy |
agy --dangerously-skip-permissions |
引数はそのまま後ろへ渡ります(gemini "テストを書いて" は gemini --yolo "テストを書いて")。
素の CLI を使いたいときは command gemini ... のように command を前置します。
起動定義は認証方式を決めません。 環境変数 GOOGLE_GENAI_USE_VERTEXAI で選びます。
| 設定 | 経路 |
|---|---|
GOOGLE_GENAI_USE_VERTEXAI=true |
Vertex AI(GOOGLE_CLOUD_PROJECT と ADC が要る) |
| 未設定・空 | ~/.gemini/settings.json の selectedType に従う(oauth-personal など) |
Vertex AI を既定にするなら共通の設定へ入れます。
devbase env set GOOGLE_GENAI_USE_VERTEXAI=trueVertex AI を使わないプロジェクト(別会社のアカウントで OAuth ログインするなど)は、
projects/<name>/env で空にして共通の値を打ち消します。GOOGLE_CLOUD_PROJECT と同じやり方です。
GOOGLE_GENAI_USE_VERTEXAI=
GOOGLE_CLOUD_PROJECT=
GOOGLE_CLOUD_PROJECTは認証方式を選ぶ変数ではありません。 gcloud や BigQuery でも使う プロジェクト指定なので、OAuth を使いながら別の用途で設定していても Vertex へは切り替わりません。
~/.gemini はアカウントグループのボリューム(/persistent/group/.gemini)にあるため、
OAuth のログインはコンテナを作り直しても残ります。
~/.bashrc はイメージの中にあるため、書き足した alias や関数はコンテナを作り直すと消えます。
作り直しても残したい設定は、置き場所 ~/.shellrc.d/ へ *.sh のファイルとして置きます。
cat > ~/.shellrc.d/my-aliases.sh <<'SH'
alias ll='ls -alF'
SH置いたファイルは、次に開く対話シェル(devbase login / tmux の窓 / VS Code の端末)から効きます。
| 項目 | 振る舞い |
|---|---|
| 実体 | /persistent/group/.shellrc.d/。同じアカウントグループのコンテナすべてで同じ設定が効き、別のグループには効かない |
| パス | 環境変数 DEVBASE_SHELLRC_DIR(/home/ubuntu/.shellrc.d)。docker exec の非対話の処理からも見える。設定を足すツールはこの変数の指す先へ 1 ファイル置き、~/.bashrc を書き換えない |
| 読まれるもの | 置き場所の直下の、名前が .sh で終わるファイル。サブディレクトリの中・. で始まる名前・他の拡張子は読まない |
| 読む順 | ファイル名の昇順。AI CLI の起動定義の後に読むので、同じ名前の alias(claude など)は置き場所の定義が勝つ |
| 読まれる時点 | 対話の bash の起動時だけ。スクリプトや docker exec ... bash -c などの非対話の処理では読まれない |
| 誤り | ファイルの中の構文・実行のエラーは標準エラーに出て、次のファイルへ進む。読み取り権限の無いファイル・リンク切れの symlink は、何も出さずに飛ばす |
置くファイルの作法:
- 1 つの用途につき 1 ファイルにし、
<名前>.shとします。順序を決めたいときは10-のような数字を前に付けます - 何度読まれても同じ結果になるように書きます。
exitは書きません(対話シェルが終わります)。標準出力へは何も出しません - devbase は置き場所へ何も書きません。置いたものを消すのは置いた側です
DEVBASE_SHELLRC_DIRを別の場所へ向けると、読み込みもそちらへ移ります。ただし向けた先は永続化されません
反映には devbase build base --no-cache が要ります。 devbase up だけでは反映されません
(読み込みの 1 行と DEVBASE_SHELLRC_DIR はイメージの中にあります)。派生イメージを使う
プロジェクトはその派生イメージも建て直し、稼働中のコンテナは devbase down → devbase up で
作り直してください。zsh(base には入っていません)と lfm イメージは対象外です。
読む先の決め方・読み込みの前後で保つ条件・エラーの扱いの仕様は
作り直しても残るシェルの設定(~/.shellrc.d)にあります。
コンテナ内の tmux には、devbase 共通の既定設定 /etc/tmux.conf が入っています
(実体は containers/base/tmux.conf)。tmux は起動すると端末の代替画面へ切り替わるため、
出力履歴は VS Code のスクロールバックではなく tmux 自身のバッファに入ります。素の tmux は
履歴 2000 行・マウス無効なので、この履歴に実質手が届きません。既定設定はそこを埋めます。
| 設定 | 値 | 理由 |
|---|---|---|
mouse |
on |
ホイールを転がすと copy-mode に入り、履歴を遡れる |
history-limit |
100000 |
既定の 2000 行はビルドログ 1 回で流れ切る |
focus-events |
on |
端末のフォーカス通知を中のアプリへ渡す。Claude Code の完了通知が正しく出し分けられる |
default-terminal |
tmux-256color |
端末種別の固定 |
terminal-overrides |
,xterm-256color:Tc を追記 |
VS Code の統合ターミナルへ 24bit 色を通す |
terminal-features |
,xterm-256color:hyperlinks を追記 |
OSC 8 のハイパーリンクを外側の端末へ渡す。宣言しないと tmux がリンクを捨て、Claude Code などが出す URL がクリックできない |
| 操作 | キー |
|---|---|
| スクロール | マウスホイール(自動で copy-mode に入る) |
| 範囲選択 | ドラッグ(ボタンを離しても選択を保持) |
| コピー | 選択中に Ctrl+C(クリップボードへ入れて copy-mode を抜ける) |
| 選択解除 | q |
| copy-mode に入る | Ctrl-b [ |
| 履歴内を検索 | copy-mode 中に Ctrl-r(上方向)/Ctrl-s(下方向) |
| copy-mode を抜ける | q |
| ペインをまたいで選択 | Shift + ドラッグ(VS Code のネイティブ選択に切り替わる) |
ドラッグ終了後も選択範囲が残ります。Ctrl+C を押すと tmux が OSC 52 を送出し、VS Code の
クリップボードへ書き込んで copy-mode を抜けます。コピーせず選択を解除する場合は q を
押します。
上表の copy-mode のキーは tmux の mode-keys に従います。既定は emacs ですが、tmux は
EDITOR / VISUAL に vi を含む値が入っていると vi へ切り替えるため、その場合の検索は
/(下方向)と ?(上方向)になります。
tmux は /etc/tmux.conf を読んでから ~/.tmux.conf を読み、同じオプションは後から読んだ
~/.tmux.conf が勝ちます。既定値を変えたい場合は ~/.tmux.conf に書いてください。
# 例: ホイールを tmux に渡さず、端末側のスクロールに戻す
echo 'set -g mouse off' >> ~/.tmux.conf
tmux source-file ~/.tmux.conf # 実行中のセッションを保ったまま反映するNote:
source-fileはセッションや配下のプロセスを終了せずに設定を読み直し、mouseのような オプションは即時に反映されます。ただしhistory-limitは新しく作る pane から適用され、既存の pane は作成時の値を保持します。既存 pane にも効かせたい場合は、その pane を作り直してください。
Note:
~/.tmux.confは永続化の対象外です(/persistent/aiへ symlink されるのは~/.claudeなどの AI 設定のみ)。コンテナを作り直すと消えるため、残したい設定は~/share配下など永続領域へ置いてコピーしてください。
Note:
/etc/tmux.confはイメージに焼き込まれています。設定を変更した場合の反映にはdevbase container buildによるイメージの再ビルドと、コンテナの作り直しが必要です。
セッションが増えてしまったときの整理(tmux-first / tmux-clean)は
環境変数ガイド を参照してください。
# 起動中のコンテナを表示
devbase ps
# 停止中のコンテナも含めて表示
devbase ps -a# 最新のログを表示
devbase project logs
# リアルタイムでログを追跡
devbase project logs -f
# 末尾100行のみ追跡
devbase project logs -f --tail 100# 階層メニュー TUI を起動(TTY ではこれがデフォルト)
devbase list
# 選択せず NAME / PLUGIN / STATUS の一覧表示のみ
devbase list --no-interactive # --plain / -P も同義TTY(端末)では
devbase listはデフォルトで階層メニュー TUI になり、 プロジェクトを選んで起動・操作(up / down / login / ps / logs / scale / build / rebuild)できるほか、画面最下部の常設メニュー(環境変数 / プラグイン / スナップショット / ステータス)へ ←→ キーで移動して各管理操作を実行できます。 パイプ・リダイレクト・CI などの非 TTY 環境では自動的に一覧表示のみに フォールバックします。画面構成とキー操作の詳細は CLI リファレンス: project グループ を参照してください。
devbase project ps が「対象プロジェクト 1 つのコンテナ状態」を表示するのに対し、
devbase list は「全プロジェクトの横断一覧」を表示します。
# コンテナ、プラグイン、環境変数、スナップショットの状態を一括確認
devbase status- プロジェクト固有のファイルは
/workに配置する --/persistent/ai(~/.claude等の symlink 先・~/share)は全コンテナで共有されるため scaleは必要最小限に設定する -- リソース消費を抑制- 作業終了後は
devbase downを実行する -- 自動ローテーションでディスク容量を管理 devbase psで状態を確認してからログインする -- 異常終了したコンテナへのログイン試行を避ける- イメージのビルドは初回と更新時のみ -- 変更がない場合はキャッシュが利用される