gcloudコマンドをdockerで実行する

gcloudコマンドをdockerで実行するためのセットアップを記しておきたいと思います。ローカルを極力汚したくない人の参考になれば幸いです。

この記事で紹介する方法は、2022年1月末に実際にセットアップした方法です。あなたがこの記事を見て試すときには手順が変わっているかもしれません。あらかじめご了承ください。

セットアップ手順

以下に従って進めていきます。

まずは以下のコマンドでgoogle/cloud-sdkの最新dockerイメージをpullしてきます。dockerhubで公開されている公式イメージを使います。

docker pull google/cloud-sdk:latest

イメージプルが終わったら、以下のコマンドでgcloudコマンドをdockerで実行できることを確認します。gcloudコマンドのバージョンが出力されるはずです。

docker run -ti  google/cloud-sdk:latest gcloud version

次に、以下のコマンドでgcloudコマンド実行時の認証情報を設定します。

docker run -ti --name gcloud-config google/cloud-sdk gcloud auth login

AWSで言えば、IAMUserのアクセスキー/シークレットアクセスキーを登録してprofileを作成するステップに近いでしょう。gcloudコマンドは、実行時の権限はgoogleアカウントに対応しているため、利用したいgoogleアカウントにログインして認証を行います。

コマンドを実行すると、ターミナルの標準出力にURLが表示されるはずです。また、コマンドは認証コードの入力を待ち受けているはずです。まずは、URLをChrome等のブラウザで開きましょう。

Go to following link in your browser:

# 以下のようなURLが表示されているはずです。クエリパラメータは記載していません。
https://accounts.google.com/o/oauth2/auth?

# 以下のように認証コードの入力を待機しているはずです。
Enter verification code:

ブラウザでの操作手順は省きますが、gcloudコマンド実行において利用したい権限を持つgoogleアカウントにログインしましょう。ログインするとブラウザの画面に認証コードの文字列が表示されるので、コピーしておきます。

ターミナルに戻ると、先ほどのgcloudコマンドが認証コードの入力を待機しているので、コピーしておいた文字列をペーストしてEnterを押しましょう。

すると、以下のように表示されるはずです。これで、gcloudコマンドの認証が完了しました。

You are now logged in as [あなたのgmailアドレス].
Your current project is [None]. You can change this setting by running:
    $ gcloud config set project PROJECT_ID

プロジェクトIDを設定、変更する必要があるなら上記のコマンド結果に記載されたコマンドを実行して設定を行ってください。

実行方法

例えば、以下のように実行することでコマンドの使用方法を確認することができます。

docker run --rm -ti --volumes-from gcloud-config google/cloud-sdk gcloud --help

docker run --rm -ti --volumes-from gcloud-config google/cloud-sdk gcloud access-context-manager --help

docker run --rm -ti --volumes-from gcloud-config google/cloud-sdk gcloud access-context-manager levels --help

コマンド引数を増やしていくことで、引数に応じたコマンドの使用方法を確認できます。

さて、実際に新しいアクセスレベルを作成するときは以下のように実行しました。

docker run --rm -ti --volumes-from gcloud-config --volume $(pwd):$(pwd) --workdir $(pwd) google/cloud-sdk \
gcloud access-context-manager levels create example_accessPolicies_name \
--title=example_accessPolices_title \
--basic-level-spec=example_accessPolices_title.yaml \
--combine-function=OR \
--policy=your_PROJECT_ID

コマンドの詳細はこちらでは解説しませんが、`--basic-level-spec`オプションは必須項目で、このオプションは=の後ろにyamlファイルを指定する必要があります。このyamlファイルはローカルに存在し、gcloudコマンドを実行するコンテナ内には存在しないため、`--volume`オプションで作業ディレクトリをマウントする必要がある点に注意です。

備考

gcloudの認証情報は`--volumes-from`オプションに指定した別のコンテナをマウントする形で読み出しています。認証情報を持つコンテナの存在は確認可能です。

❯ docker container ps -a
CONTAINER ID   IMAGE                     COMMAND                  CREATED         STATUS                  PORTS     NAMES
9731ffa88b63   google/cloud-sdk          "gcloud access-conte…"   3 minutes ago   Up 3 minutes                      boring_mclean
da0ddf318b62   google/cloud-sdk          "gcloud auth login"      6 days ago      Exited (0) 6 days ago             gcloud-config
ae7eb115d1ce   google/cloud-sdk:latest   "gcloud version"         6 days ago      Exited (0) 6 days ago             nostalgic_zhukovsky
9162cbf46f51   google/cloud-sdk:latest   "gcloud version"         6 days ago      Exited (0) 6 days ago             practical_jang

なお、以下のようにaliasを書いたのですが、エラーが吐かれてしまって実行できませんでした。

alias gcloud='docker run --rm -it --volumes-from gcloud-config google/cloud-sdk'

WARNINGの内容は私のmacがM1Proのために発生している内容のため無関係です。二行目のエラーを読むと、$PATH変数をいじってやればよさそうな気がするのですが、どのパスを追加してやればよいのか分からなかったので、一旦aliasを張るのは諦めて使っています。

❯ gcloud --version
WARNING: The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested
docker: Error response from daemon: OCI runtime create failed: container_linux.go:380: starting container process caused: exec: "--version": executable file not found in $PATH: unknown.
~
❯

aliasについて追記します。
以下のように書くことでエラーは解消しました。

alias gcloud='docker run --rm -it --volumes-from gcloud-config google/cloud-sdk gcloud'

AWS CLIをdockerで実行するときに、以下のようaliasを書いて動かしていたので、同じ感覚で書いたのがハマった原因のようです。

alias aws='docker run --rm -i -v ~/.aws:/root/.aws -v $(pwd):/aws amazon/aws-cli'

この記事が気に入ったらサポートをしてみませんか?