前置き
GCPのCLIであるgcloud
を使用する場合、手元のMacまたはPCにCloud SDKをインストールする必要があります。
しかしこの手のツールやミドルウェアをインストールすると依存関係やら、バージョンアップ時になにかが壊れたりとか、トラブルに遭遇することが(気持ち的に)多く、あまりインストールしたくありません。😭
なのでgcloud
そしてGKEで使うkubectl
コマンドをコンテナに押し込めて使おうと思います。
1コマンドでglcoudを起動でき、ローカルのDocker imageにもアクセスできる環境を目指します。😤
いくつもコマンド叩かなきゃいけないようなら、ローカルにgcloud直接インストールしたほうがマシに思えてしまうし、ローカルのDocker imageにアクセスできないと、せっかくローカルでビルドしてあるDockerイメージを GCPのContainer Registryにpushできなくなっちゃいまからね〜。
Ubuntu 17.10でためしていますが、Macでもいけるはず..です。問題があればぜひご一報を🙏
本題
使用イメージ
googleオフィシャルな、google/cloud-sdk:alpine
を使います。
レジストリはこちら。
https://hub.docker.com/r/google/cloud-sdk/
latestタグの方はdebianベースで全部入りなんで、苦労したくなければそっちを使ったほうがいいかもしれません。しかしサイズ1.5G😮もあるので、やめとくことにしました。軽さは大事。
Dockerfile
alpineベースのイメージはgcloud以外kubectlすら入っていない硬派タイプなので、Dockerfileを書いて最低限、kubectlだけは入れておく必要があります。
インタラクティブに作業するためのイメージなので、ENTRYPOINTにはbashを指定しておきます。
日々のタイピング量節約。
FROM google/cloud-sdk:alpine
MAINTAINER xxxxx <xxxxx@xxxxx.jp>
WORKDIR /root/
RUN apk update \
&& apk upgrade \
&& gcloud components install kubectl \
&& apk add docker --no-cache
ENTRYPOINT bash
これだとビルドしたイメージも600MBくらいですみます😊
docker-compose.yaml
このイメージをビルドして、適切なオプション渡してコンテナ起動してもいいんですが、オプションが結構多いので、docker-compose.yaml
も書きます。
version: '3'
services:
gcloud:
build: .
volumes:
- ./work/:/root
- ./config:/root/.config/gcloud
- /var/run/docker.sock:/var/run/docker.sock
environment:
- CLOUDSDK_CONFIG=/root/.config/gcloud
- PROJECT_ID=xxxxx
volumesとenvironmentがポイント。
まず、volumesの方から
./work:/root
workディレクトリを作業ディレクトリにする設定
ここで作業することになるので、ふさわしい場所をマウントすると良いです。対象プロジェクトのディレクトリとか。-
./config:/root/.config/gcloud
gcloudの設定を永続化するためにローカルに書き出す場所
これをやっておかないと、毎回GCPにログインするハメになります。
公式なgoogle/cloud-sdkのDockerファイルを見ると
VOLUME ["/root/.config"]
という記述があります。要するに設定ディレクトリをexportしているわけです。
このSDKの使い方を見るとOnce you authenticate successfully, credentials are preserved in the volume of the gcloud-config container.
というわけで、gcloud-config コンテナを立ててそのvolumeを共有しろ的なことが書いてあります。
credentialsを共有するためだけにコンテナを立てたくないし、永続化してほしいので、exportしているその先をさらにdocker-composeのvolumesでマウントしてやります。これでgcloud-config用のコンテナは必要なくなりました。😀
-
/var/run/docker.sock:/var/run/docker.sock
これでホスト側で動いているdocker プロセスにコンテナ側から接続します。 これだけでイメージが共有できる。素晴らしい。
続いて envrionment。
CLOUDSDK_CONFIG=/root/.config/gcloud
デフォルト値なんですが念の為指定PROJECT_ID=xxxxx
なにかと入用になるので、環境変数にGKEで発行したPROJECT_IDを指定しておきます。
使い方
こんなディレクトリ構成に配置。
+ Dockerfile
+ docker-compose.yml
+ config/
+ work/
おもむろに実行
docker-compose run gcloud
コンテナがビルドされ、コーヒー一杯飲み終える頃にはbashが起動します☕
gcloudコマンドを初期化
gcloud init
これでローカルにcloud-sdkをインストールしたのとほぼ変わらない使用感を実現できるはずです。
なお、これらのコードを、以下のリポジトリにあげています。
タイピング量削減のため、docker-composeのラッパーシェルgcloud.sh
もつけております。
これがあれば、gcloudコマンドを使用したい時は
./gcloud.sh
ですみます。
便利使っていただければと🌴