カテゴリー
Gemini-CLIをDockerコンテナ内で限定して動作させてみる
※ 当ページには【広告/PR】を含む場合があります。
2025/07/09

AI開発ツールの進化は日々目覚ましいものがあります。
個人的には(趣味も兼ねているので)まだまだ人力でのプログラミングでコツコツと作り上げていくスタイルがほとんどですが、数年後の状況を考えると、周りは皆、AIエージェントによる「Vibeコーディング」の全盛期を迎えるのかもしれません...。
もちろん、数年後のことは分からないのですが、来たるべき大きな潮流に、そのままその波に乗れるように少しづつVibeコーディングにも慣れておきたいものです。
で、今回はちょっと前からチラホラ話題となっているGoogleのコマンドラインベースのAIワークフローツール・
NodejsコンテナにGemini-CLIを導入する
ここでのGemini-CLI開発環境構築の前提として、
+ ホストマシン(開発用パソコン等)にはNodejsをインストールさせたくない
+ Gemini-CLIはDocker内部で動作させ、グローバルインストールはしない
ということを念頭に進めていきます。
そもそもGemini-CLIには独自に「Sandbox」という機能モードが備わっていますが、ユーザーによるカスタマイズ性がイマイチです。
先にこのSandbox機能に関して軽く説明しておきましょう。
Gemini-CLIのSandbox
Gemini-CLIに限らず、AIエージェントにデスクトップでの様々な操作を行わせたい場合、心配になるのが、「AIがユーザーの意図を越えて好き勝手に色んなことをやってしまう」リスクです。
例えば、外部へ通信させてほしくない情報がAIの処理で漏れてしまったり、セキリュティ面で重要なクレデンシャル変数(.envなど)を編集して破壊してしまったり、様々な影響を与えてしまうおそれがあります。
そこで、このような影響をDockerなどのコンテナ技術を利用して、AIエージェントにアクセスできるファイルやプロセスの範囲を限定させる機能が
Sandbox(=砂場)
文字通り、子どもが遊べる場所が"砂場"の中だけで、その外では遊ばせないようにさせるイメージです。
一見すると便利に使えそうなサンドボックス機能ですが、ホストOSにNode.jsとDocker/Podmanをインストールし、その上でGemini-CLIをグローバルインストールしないと使えません。
つまり、DockerでNodeコンテナを起動させ、そのコンテナ内にGemini-CLIをインストールさせて使う場合、そもそも"サンドボックス化"しているので、Gemini-CLIのサンドボックス機能を使う必要がありません。
NodeコンテナにGemini-CLIをインストールする
話は逸れましたので、話を戻してNodeコンテナへGemini-CLIを導入していきます。
著者のホストマシーンですが、Debian Linuxを使っています。
$ lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description: Debian GNU/Linux 12 (bookworm)
Release: 12
Codename: bookworm
当然、Docker/Docker-Composeが動くこと前提です。 インストール方法は以下の記事内容を参考してください。
適当なフォルダを作成し、そこにDocker関連のファイルを作成します。
$ touch Dockerfile compose.yml .env
これらのファイルを以下の内容で編集しておきます。
FROM node:24-bookworm-slim
RUN apt update && apt upgrade -y
RUN apt install curl -y
ENV PS1="[\u@\h:\w]$"
CMD ["bash"]
services:
app:
image: gemini-cli-dev:node24
build: .
container_name: gemini-cli-dev
user: "node:node"
environment:
NODE_ENV: ${NODE_ENV}
volumes:
- ./:/usr/src/app
working_dir: "/usr/src/app"
tty: true
NODE_ENV=development
ファイルを編集したら、イメージをビルドさせてみます。
$ docker compose build
問題なくイメージがビルドできたら、コンテナを起動し、インタラクティブモードにアタッチし中に入って作業を進めます。
$ docker compose up -d && docker compose exec app bash
#...コンテナ内にアタッチ
ここからは簡単なnodejsプロジェクトを作ります。
手動で
package.json
yarn init
package.json
適当だと以下のようなファイルで結構です。
{
"name": "my-gemini",
"version": "0.0.1",
"description": "To learn gemini-cli",
"private": true,
"scripts": {}
}
では待望のGemini-CLIをローカルインストールしましょう。
$ yarn add -D @google/gemini-cli
npxコマンドでも良いのですが、ローカルインストールしたため、そのままだと
gemini
ここではyarnのサブコマンドとして利用する方式で、
package.json
{
//...
"scripts": {
//👇追加
"gemini": "gemini",
//...
さて、最初のGemini-CLI起動ですが、
--debug
$ yarn gemini --debug
ここからは対話的な設定操作に入ります。

まずは、CLIの外観を選ぶようです。 ここではDefaultにしておきます。
次に認証モードを選択します。

3つほど選択肢がありますが、とりあえずご自身のGoogleアカウントで認証する
「Login with Google」

こちらのコンテナで、認証待ちを行わせている状態しておき、表示されたURLアドレスを適当なブラウザで開いてみましょう。


ご自身のGoogleアカウントでログインします。

ログインすると、ブラウザからのリダイレクトに失敗します。
これは自作のコンテナの中から外部へ出した通信ですので、ホスト側のブラウザはDockerコンテナ内へ認証確認のレスポンスを戻すことがそもそもできません。
そこで、ブラウザにリダイレクトされたURL(図の枠で囲ったアドレス)をメモしておきます。
認証待ちのコンテナへレスポンスを受信させるために、トリッキーな方法ですが、同一のDockerネットワークを共有する別のコンテナを立ち上げます。
作業フォルダ内で別のターミナルを開き、同じDockerイメージから再びコンテナを起動し、アタッチします。
#...新しいターミナルで
$ docker compose up -d && docker compose exec app bash
#...コンテナ内にアタッチ
そこで、Curlを使ってブラウザの変わりに先程メモしたURLにアクセスします。
$ curl -v "http://localhost:36375/oauth2*****"
* Trying 127.0.0.1:36375...
* Connected to localhost (127.0.0.1) port 36375 (#0)
> GET /oauth2callback?state=******** HTTP/1.1
> Host: localhost:36375
> User-Agent: curl/7.88.1
> Accept: */*
>
< HTTP/1.1 301 Moved Permanently
< Location: https://developers.google.com/gemini-code-assist/auth_success_gemini
< Date: Mon, 07 Jul 2025 05:45:01 GMT
< Connection: keep-alive
< Keep-Alive: timeout=5
< Transfer-Encoding: chunked
<
* Connection #0 to host localhost left intact
これで認証待ちにしていた方のターミナルを覗くと、

というように認証が完了していればOKです。
なお、一度認証が済んだら、コンテナを停止しない限りは再ログインなしにGemini-CLIが使えます。
$ yarn gemini
これで独自にカスタマイズしたNodeコンテナでもより柔軟にGemini-CLIが利用できるようになったと思います。
Google AI StudioにアサインしてAPIキーを利用する
先程までで、Gemini-CLIの認証方法にGoogleアカウントを使うやり方を紹介していましたが、コンテナを起動するたびにブラウザを介してとても面倒なやり取りを行う必要が出てきます。
最初のうちは良いかもしれませんが、後々非常に煩わしい作業になること必至です。
またGemini-CLIの利用は基本的に無料ですが、使い込んで利用頻度が多くなると無料枠上限に達してしまいます。
より実務的な利用法を検討されている場合、無料枠を越えたら有料とはなるのですが、「Google AI Studio」でAPIを使う方式へ移行するほうが望ましいです。
Google AI StudioのAPI(無料プラン)の発行はさほど時間を取ることはありません。
有料プラン版のAPIへアップグレードする場合には、Google Cloud Platformのアカウント登録と支払い方法の設定が必要になるので、必要とあらばそのときに検討されると良いでしょう。
無料プランのAPIを発行し、Gemini-CLIを使うところまで確認しておきましょう。
Google AI StudioでAPIキーを発行
まずはGoogleアカウントを使って
ログインできたらダッシュボードにある
[Get API key]

次のページの
[APIキーを作成]

APIの作成先となるGoogle Cloudのプロジェクトを選択、もしくはプロジェクトの新規作成を行います。

ここでは既存のプロジェクトを指定しておきます。
しばらく待つとAPIが発行されます。

これでAPIキーが無事発行されました。
なおこの時点では、Google Cloudプロジェクトで課金の請求先情報の設定をしていないので、無料プランのAPI扱いとなり、利用には制限が付きます。
APIが正常に発行されると、Google AI Studioのダッシュボードには紐付けされたGoogle Cloudプロジェクトが表示され、現在のAPIの利用状況と請求情報が確認できます。

また、ダッシュボードの右下にある
[Open in Cloud Console]

Google CloudプロジェクトにはAPIの設定などが確認できます。

さらに、APIの有料プランへのアップグレードするための支払い方法の設定もこのコンソールから設定することができます。

ここでは有料プランへのアップグレード手順は割愛します。
Nodeコンテナに設定を反映させる
では先程のAPIキーをコピーして、
.env
NODE_ENV=development
GEMINI_API_KEY=APIキーの値
この変数をコンテナ起動時に有効するため、
compose.yml
services:
app:
image: gemini-cli-dev:node24
build: .
container_name: gemini-cli-dev
user: "node:node"
environment:
NODE_ENV: ${NODE_ENV}
#👇追加
GEMINI_API_KEY: ${GEMINI_API_KEY}
volumes:
- ./:/usr/src/app
working_dir: "/usr/src/app"
tty: true
これでGeminiで使う準備が整いました。
最後にDockerコンテナを立ち上げ、Gemini-CLIを実行してみましょう。
$ docker compose up -d && docker compose exec app bash
#コンテナ内にアタッチ
$ yarn gemini

これでいつでも認証済みの状態からGeminiを利用することが可能です。
まとめ
今回はGemini-CLIをDockerコンテナの内部で利用する環境づくりについて考えてみました。
これでGemini-CLIのサンドボックス機能を使わなくても、独自にカスタマイズしたサンドボックス環境が柔軟に利用できるようになったはずです。
今後時間があればGemini-CLIの使い方などを気が向いたときに紹介していくかもしれません。
記事を書いた人
ナンデモ系エンジニア
主にAngularでフロントエンド開発することが多いです。 開発環境はLinuxメインで進めているので、シェルコマンドも多用しております。 コツコツとプログラミングするのが好きな人間です。
カテゴリー