💭

Gemini CLIをコンテナ化する

に公開

2025年6月末に突如公開されたGemini CLIですが、乗り遅れること1か月、ようやく触ってみたので何かアウトプットを出してみたくて記事化しました。すでに多くの方が実践されていることだと思うので、特に目新しいことはありませんが、悪しからず。

この記事自体もGemini(Code Assist)に素案を作ってもらいました。そのまま出すには文体が自分らしくなくて違和感めっちゃあるので修正していますが(-_-;)

はじめに

Googleの最新AIモデル「Gemini」。そのパワフルな機能をコマンドラインから手軽に利用できるのが@google/gemini-cliです。

せっかくなので、Gemini CLIをコンテナ化して実行できるようにしました。

この記事で解決できること

  • ローカルにNode.jsなどをインストールせずにGemini CLIが使える。
  • Dockerコンテナとして環境を管理できるため、誰でも同じ環境をすぐに再現できる。
  • CLIで生成したファイルを、コンテナを閉じてもホストPCに永続化できる。

前提条件

  • ホストマシンのOSはWindows11。(ほかのOSでも問題ないと思いますが)
  • コンテナ環境はDocker Desktop 4.43.2で構築。
  • GeminiのAPIキーは取得済み。

成果物

geminiCLI-docker

コンテナイメージの中身は、Dockerfileを参照。

セットアップ手順

手順といっても、クローンしてコンテナイメージビルドするだけです。

1. リポジトリをクローン

まず、設定済みのDockerfileが含まれたリポジトリをローカルにクローンします。

git clone https://github.com/hayatok/geminiCLI-docker.git
cd geminiCLI-docker

2. Dockerイメージをビルド

次に、Dockerfileを元にDockerイメージをビルドします。以下のコマンドを実行すると、gemini-cli-appという名前のイメージが作成されます。

docker build -t gemini-cli-app .

このDockerfileは、軽量なnode:20-slimイメージをベースに、最新の@google/gemini-cliをインストールするだけのシンプルな構成です。

3. APIキーを設定

Geminiを利用するにはAPIキーが必要です。プロジェクトのルートに.envファイルを作成し、ご自身のAPIキーを記述してください。

.env ファイル

GEMINI_API_KEY=ここにあなたのAPIキーを記述

[!IMPORTANT]
.envファイルは.gitignoreに含まれているため、Gitの管理対象外です。誤ってコミットしないようにご注意ください。

Gemini CLIを実行する

準備は整いました。早速コンテナを起動してGeminiと対話してみましょう。

対話モードで起動する

一番基本的な使い方です。以下のコマンドで、Geminiと対話できるセッションが始まります。

docker run --rm -it --env-file ./.env gemini-cli-app

--rmオプションで、コンテナ終了時に自動でコンテナが削除されるため、クリーンな状態を保てます。

生成したファイルをホストPCに保存する

gemini new fileのようなコマンドを使うと、コンテナ内にファイルが生成されます。しかし、そのままではコンテナを終了するとファイルも消えてしまいます。

そこで、ホストPCのディレクトリをコンテナにマウントすることで、生成物を永続化しましょう。

  1. 保存用ディレクトリの作成
    まず、ホストPC上にファイルを保存するためのディレクトリを作成します。

    mkdir gemini_output
    
  2. マウントオプション付きでコンテナを起動
    -vフラグを使って、先ほど作成したgemini_outputディレクトリをコンテナ内の作業ディレクトリ/workにマウントします。

    Windows (PowerShell推奨):

    docker run --rm -it --env-file ./.env -v ${pwd}/gemini_output:/work gemini-cli-app
    

感想

手を動かしたログを、Geminiに記事形式でまとめさせるのいいですね。文体は私のスタイルに似ても似つかないですが、むしろ私がイチから書くより読みやすいしわかりやすいし簡潔。私要らないのでは・・・?

Discussion