0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

gemini-cli を podman の sandbox 内でつかう

0
Last updated at Posted at 2026-03-28

背景

  • 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 が開発用のサーバーを起動しても外部からアクセスできない

参照

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?