🤖

Ubuntu で使う開発コンテナーでの Gemini CLI ログイン時の問題への対応方法

に公開

はじめに

本記事では、VS Code の開発コンテナー(Dev Container)内で Google の AI アシスタントである Gemini CLI をセットアップし利用する際に発生するログインへの問題へ対処する方法について解説します。

開発環境をコンテナー化することで、ホストマシンをクリーンに保ちつつ、再現性の高い開発環境を簡単に構築できます。しかし、Gemini CLI のような認証が必要なツールをコンテナー内で利用するには、少し工夫が必要です。ここではホストが Ubuntu 環境の場合についての対処方法を説明します。

Gemini CLI とは

Gemini CLI は、ターミナルから対話形式で利用できる Google の AI ツールです。主な特徴は以下の通りです。

  • AIによる開発支援: コードの生成、デバッグ、エラー分析などを AI がサポートします。
  • Node.jsベース: npm を通じて簡単にインストールできます。
  • ローカルツールとの連携: 開発環境にインストールされたツールを直接実行し、その結果を基に分析や提案を行います。

開発コンテナーとは

開発コンテナーは、Docker コンテナーを完全な機能を備えた開発環境として利用するための仕組みです。VS Code の Dev Containers 拡張機能を使うことで、簡単に導入できます。

詳しい説明は次の資料をご覧ください。

必要なもの

必要なものとしては次の項目が挙げられます。

  • Docker Engine + Docker Compose (Docker Desktop に含まれる)
  • Visual Studio Code (VS Code)
  • VS Code の DevContainers 拡張機能

Linux、Windows、macOS のいずれでも使うことができます。

開発コンテナーのメリット

開発コンテナーのメリットとしては次の項目が挙げられます。

  • 環境の分離: ホストマシンに Node.js や各種ツールをグローバルインストールする必要がなく、環境をクリーンに保てます。
  • 再現性: devcontainer.jsonDockerfile で環境をコード化するため、誰でも同じ開発環境を再現できます。
  • プロジェクトごとの環境構築: プロジェクトごとに最適化されたツールやライブラリのバージョンを持つコンテナーを用意できます。

ここ数年、筆者は開発コンテナーを使っていますが、次のような留意事項があると考えています。性能面ではホストマシンでそのまま開発した方が良いので、全面移行はできていなくて、条件付きでの利用となっています。

  • 通常のコンテナーがアプリ実行環境を提供するのに対して開発コンテナーは開発環境を提供
  • 開発環境の参照実装例として利用するのが良い
  • 実際の開発で使う場合は Docker ボリュームと組み合わせて利用するのが良い

ということで、これまでは、実際の開発では開発コンテナー用のファイルは必須というところまではいかない感じがありました。とはいえ、開発環境の記録として Git リポジトリに履歴はあった方が良いので、開発コンテナー用のファイルをプロジェクトで用意するようにしていました。

今後は AI が開発環境を把握するためにも、開発コンテナー用のファイルを用意しておくことが必須となるのだろうと考えています。これがあれば、AI がアプリケーションの開発環境・CI/CD 環境・実行時環境について、正しく認識できるようになるからです。

なぜ開発コンテナーで Gemini CLI を使うのか

ホスト環境で Gemini CLI を利用する場合、コマンド実行も頻繁に行うため、rm -fr ~/ といった危険な操作コマンドが実行されてしまい、事故が起こる可能性があります。

開発コンテナーを使うと、開発コンテナーのメリットにあった「環境の分離」により、そういった操作が実行されたとしても、ホスト環境への影響は限定的に済みます。

他には、Gemini CLI がローカルのツールを実行する特性上、プロジェクトで使うツール群と一緒にコンテナー内に閉じておくことで、より正確で再現性の高い AI アシストが期待できます。

開発コンテナーで Gemini CLI を使う際の課題

Gemini CLI を初めて利用する際には、Google アカウントでの認証が必要です。通常、CLI はブラウザを自動で開いて認証プロセスを進めます。しかし、GUI を持たない基本的な開発コンテナー内ではブラウザを開けないため、認証でつまずくことがあります。

この記事では、この認証でつまずかないようにする方法を紹介します。

xdg-open コマンドを含む開発コンテナーの用意

最もシンプルな解決策は、開発コンテナーで gemini コマンドを使うときは、xdg-utils パッケージをインストールするという方法です。

認証時にブラウザを開く必要があるため、それに対応するユーティリティを追加すれば良いのです。多くの Linux 環境では xdg-open コマンドがその役割を担っており、これは Debian/Ubuntu をベースとするパッケージ管理システムでは xdg-utils パッケージに含まれています。他のディストリビューションでは別のパッケージ名になります。

具体的な対応方法について説明します。ここでは、次のようなフォルダ構成でファイルを用意します。また、app20250711 フォルダを ${PROJ_DIR} と表記します。

app20250711/
├── .devcontainer/
│   └── devcontainer.json
└── dvc-gemini/
    ├── Dockerfile
    └── compose.yaml

1. Dockerfile の作成

プロジェクトのルートに以下の Dockerfile を作成します。このファイルは、公式の Node.js 開発コンテナーイメージをベースに、xdg-utilsgemini-cli をインストールします。

FROM mcr.microsoft.com/devcontainers/typescript-node:22-bookworm

# Gemini CLI を使う場合に xdg-utils が必要
RUN sudo apt-get update \
    && sudo apt-get install -y xdg-utils \
    && sudo apt-get -y autoremove \
    && sudo apt-get -y clean \
    && sudo rm -rf /var/cache/apt /var/lib/apt/lists

# gemini-cli を node ユーザーでグローバルインストール
RUN sudo -u node sh -c 'npm install -g @google/gemini-cli'

これで gemini コマンドの実行ができる開発コンテナー用の Docker イメージが作成できるようになります。

2. compose.yaml の作成

これをビルドするにあたって compose.yaml ファイルを用意します。docker コマンドでイメージビルドはできますが、イメージのタグをつけたりするときに、compose.yaml ファイルを使えば簡単に指定ができますし、コンテナーの利用例も提示しやすくなります。

name: dvc-gemini
services:
  dvc-gemini:
    build: .
    image: dvc-gemini:0.0.1

この Docker イメージをビルドします。

cd ${PROJ_DIR}
docker compose -f dvc-gemini/compose.yaml build

3. devcontainer.json の作成

次に、開発コンテナー用の devcontainer.json を作成します。

{
    "name": "dvc-gemini-001",
    "image": "dvc-gemini:0.0.1"
}

4. 開発コンテナーの起動

それから VS Code を起動します。

cd ${PROJ_DIR}
code .

VS Code の左下に通知が表示されるので、「コンテナーで再度開く」をクリックします。

/images/20250711_gemini_devcontainers/app20250711-001.png
「コンテナーで再度開く」の通知

すると、開発コンテナーが起動して VS Code をアタッチした画面になります。これで、開発コンテナーのターミナルを VS Code の画面に表示して、gemini コマンドが実行できるようになります。

/images/20250711_gemini_devcontainers/app20250711-002.png
開発コンテナーをアタッチした VS Code の画面

5. Gemini CLI の起動

実際に開発コンテナー内のターミナルで gemini コマンドを実行します。

gemini

なお、Gemini Code Assist Standard などのライセンスを使うアカウントの場合は、環境変数 GOOGLE_CLOUD_PROJECT でプロジェクト名の指定が必要です。ライセンスが使える Google プロジェクトとして proj001 があるとしたら、次のようにします。

GOOGLE_CLOUD_PROJECT=proj001 gemini

すると、Gemini CLI が起動して、ホストで実行するのと同じように設定を選択する画面となります。

/images/20250711_gemini_devcontainers/app20250711-003.png
Gemini CLI の起動画面

Enter を入力すると、それから認証方式を選択する画面になります。

/images/20250711_gemini_devcontainers/app20250711-004.png
Gemini CLI の認証方式の選択画面

ここで Google アカウントへログインをすることを選択した状態で Enter を入力すると、ホストの Web ブラウザでログイン用の URL を開くダイアログが表示されます。

/images/20250711_gemini_devcontainers/app20250711-005.png
URL を開く画面

「開く」をクリックし、ログインの手続きをします。

6. ログインの手続き

アカウントの確認画面が表示されるので、使用するアカウントであることを確認して、アカウントをクリック。

/images/20250711_gemini_devcontainers/app20250711-006.png
アカウントの選択画面

確認画面が表示されるので「ログイン」をクリック。

/images/20250711_gemini_devcontainers/app20250711-007.png
ログインの画面

ログインが成功すると、Gemini のプロンプトが表示されます。

ちなみに、Gemini Code Assist Standard などのライセンスを使うアカウントで環境変数 GOOGLE_CLOUD_PROJECT を指定しないままログインすると、次のようなエラーメッセージが表示されます。

Failed to login. Message: This account requires setting the GOOGLE_CLOUD_PROJECT 
env var. See https://goo.gle/gemini-cli-auth-docs#workspace-gca

/images/20250711_gemini_devcontainers/app20250711-008.png
環境変数 GOOGLE_CLOUD_PROJECT の指定が足りなくエラーとなった画面

desktop-lite フィーチャーを追加した開発コンテナーで使う場合

ここで、次の devcontainer.json のように、desktop-lite フィーチャーを追加した開発コンテナーで使う場合は、xdg-utils パッケージの追加は必要ありません。しかし、noVNC が自動起動する設定となるためか、desktop-lite フィーチャーを追加していない開発コンテナーとは gemini コマンドの初期設定画面の挙動が変わっていることがあります。

{
    "name": "dvc-gemini-desktop001",
    "image": "mcr.microsoft.com/devcontainers/typescript-node:22-bookworm",
    "features": {
        "ghcr.io/devcontainers/features/desktop-lite:1.2.7": {
            "version": "latest"
        }
    }
}

つまり、gemini コマンドを対話式モードで実行すると、認証がうまくできないことがあるのです。そのため、開発コンテナー内で gemini コマンドを初めて実行する前に少し準備をしておきます。

まず、認証方法は ${HOME}/.gemini/settings.json で指定可能です。Google アカウントにログインする場合は、次のようにして ${HOME}/.gemini/settings.json ファイルを作成しておきます。

{
  "theme": "Default",
  "selectedAuthType": "oauth-personal",
  "preferredEditor": "vscode"
}

Debian/Ubuntu だと、次のようにしてコマンドで作成できます。

cat <<EOS > ${HOME}/.gemini/settings.json
{
  "theme": "Default",
  "selectedAuthType": "oauth-personal",
  "preferredEditor": "vscode"
}
EOS

それから、gemini コマンドを実行するときに、--prompt オプションを使って非対話モードとします。

gemini --prompt '開発プロジェクトの開始にあたって質問があったらしてください'

なお、Gemini Code Assist standard などを契約している場合は、GOOGLE_CLOUD_PROJECT 環境変数へ使用するプロジェクトの指定をしながら gemini コマンドを起動すれば良いです。

GOOGLE_CLOUD_PROJECT=proj001 \
  gemini --prompt '開発プロジェクトの開始にあたって質問があったらしてください'

非対話モードだと、Google アカウントで Gemini CLI の利用を許可するための URL がコンソールに出力されます。
それを Chrome で開いたら、後は「6. ログインの手続き」で説明したときと同じです。
ログインの手続きをすれば、gemini コマンドが使えるようになります。

Discussion