DevContainer で Rebuild しても .zsh_history が残るようにする

📜
note

コンテナを Rebuild する機会はそこまで多くないので、これまで適当に内容をコピペしたりリポジトリ配下に置いたりして誤魔化していたのだが、つらくなってきたの仕組み化しようと思った。履歴は(コンテナの)命より重い・・・・! これまでやってこなかった理由の一つに「リポジトリに含まれる DevContainer の設定に個人の都合を含みたくない」というのがあり、いろいろ方法を考えていたのだが結果としては妥協することにした。

方法は公式にも紹介されているように .devcontainer.jsonmounts を使う。これは Claude Code の公式 DevContainer も同じようなことをしていた。

とはいえこのまま使っているわけではなく、もろもろの設定のだるさや保存先が気になったので、ホスト側に XDG Base Directory に沿うような形で配置することにした。

// devcontainer.json
{
    "initializeCommand": "mkdir -p ${localEnv:HOME}/.local/share/devcontainer/${devcontainerId} && touch ${localEnv:HOME}/.local/share/devcontainer/${devcontainerId}/.zsh_history",
    "mounts": [
        "source=${localEnv:HOME}/.local/share/devcontainer/${devcontainerId}/.zsh_history,target=/home/vscode/.zsh_history,type=bind"
    ]
}

これでだいたいリポジトリ毎に履歴が ~/.local/share/devcontainer/{devcontainerId}/.zsh_history へ溜まるようになる。 ${containerEnv:HOME} が使えそうだが Build 時には使えなかった。

これを個人的な設定として devcontainer.local.json のような形で設定できれば理想だったのだがそういった機能は現状ではできないようだ。

.zsh_history 以外にも Claude Code なんかの履歴も同じようにできそうだが、 AI との会話ログにそこまで価値を感じてないのと個人的過ぎるのでやることはないと思う。

Refs

yaakai.to