背景
- gemini-cli をセキュアに使うために、sandbox 内で動かしたい
- LLM が稀にとても恐ろしい挙動をするので
- podman の理由は Dockerfile
- gemini-cli の 環境変数
GEMINI_SANDBOXや--sandboxがうまく動かなかった(一番の理由) - gemini-cli のコンテナのインスタンスは使い捨て(
--rmがついている)- 中にインストールしたツールが消える
- 毎回インストールに時間がかかって面倒
- でもプロジェクト(ディレクトリ)単位で別インスタンスを使いたい(マウントやパスの問題)
達成したいこと
- podman コンテナ(rootless) を自分で起動して、 gemini-cli を動かす
- インスタンスを使い捨てにしない & ディレクトリ単位でインスタンスを分ける
-
--rmなしで起動。--nameでディレクトリパスをいれる
-
-
-pがあるとき tty を割り当てるとうまく動かないので判定する
スクリプト
zsh の関数として、 .zshrc 内に定義する(たぶん bash とかでも動くはず)
function gemini() {
local container_image="${GEMINI_IMAGE:-us-docker.pkg.dev/gemini-code-dev/gemini-cli/sandbox:0.35.2}"
local container_name="gemini-cli-$(pwd | sed 's@/@-@g')"
local tty_arg="-t"
for i in "$@"
do
case "$i" in
"-p")
tty_arg="";
break;
esac
done
podman run -i $tty_arg \
--name "${container_name}" \
--env 'TERM,LC_*' \
--workdir="$(pwd)" \
--userns="keep-id:uid=1000,gid=1000" \
--mount type=bind,src="$(pwd)",dst="$(pwd)" \
--mount type=bind,src="$HOME/.gemini",dst="/home/node/.gemini" \
"${container_image}" \
gemini "$@" \
|| ( \
podman start "${container_name}" ; \
podman exec -i ${tty_arg} "${container_name}" gemini "$@" \
)
}
使い方
- 普通に
geminiもしくは、echo xxx | gemini -p 'zzz' -
-p以外の引数や環境変数による設定変更はあまり想定していない - 一応、
gemini mcp listみたいなコマンドは使える
スクリプトのポイント
- ユーザ名前空間の設定を
--userns=keep-id:uid=1000,gid=1000にする- ホストのユーザの uid,gid が コンテナ内のユーザ uid=1000,gid=1000 に割り当てる
- 公式イメージ
gemini/sandboxの場合、 uid:1000,gid はデフォルトユーザの node - これやらないと、ファイルの所有 uid, gid のホスト、コンテナ間の整合性がとれなくなる
- もしくは
--userns=host --user=rootにする- ホストは起動ユーザでコンテナ内では rootになる。
-
-pを指定した時は、ttyを割り当てない- tty を割り当てると動かないため
- コンテナ名に
/は使えないので-に置換- パスが長すぎると、コンテナ名の上限に引っかかる
- 対策) md5, sha256 などでハッシュを取る or 一番下のディレクトリのみ つかうようにすればいい
- パスが長すぎると、コンテナ名の上限に引っかかる
- フォールバック付きの環境変数で任意のコンテナを起動可能
- デフォルトは公式のものになっています。latest はつかえないので自分でバージョンアップが必要
- Dockerfile か entrypoint.sh とかで コンテナ内に、事前に
geminiをインストールしておく
注意点
- gemini-cli のバージョンアップは次のどっちか
- 内部で行う
- コンテナのイメージのバージョンを上げて、新しく作り直す
- 再起動時は落ちる(exitになる) ので、もう一度起動すればOK
- コンテナ内で起動しているだけ
- ネットワークの制限などはしていない
- 関係ない通信が飛ぶかも
- ポートフォワードの設定もしていない
- AI が開発用のサーバーを起動しても外部からアクセスできない
- ネットワークの制限などはしていない
参照
- podman の id マッピングの設定