DockerコンテナからGoogle Cloud SDKのコマンドを簡単に実行できるコマンドをつくってみた

なるべくDockerを利用して手元の端末を汚さない試み。便利かはわかりません。


## 使い方

`docker-gcloud` コマンドはDockerコンテナで`gcloud` コマンドを実行しています。
認証情報はホストの`~/.config/gcloud` を参照します。

Cloud Buildにジョブ登録してみます。


```console
# credentials.dbなどがある前提
> ls ~/.config/gcloud/
access_tokens.db   config_sentinel    credentials.db     legacy_credentials
active_config      configurations     gce                logs


> docker-gcloud --version
Google Cloud SDK 267.0.0
bq 2.0.49
core 2019.10.15
gsutil 4.44


> cat <<EOF > cloudbuild.yaml
steps:
- name: 'gcr.io/cloud-builders/git'
  entrypoint: 'bash'
  args: ['-c', 'echo "hoge"']
EOF


> docker-gcloud builds submit \
  --config=cloudbuild.yaml \
  --no-source
Created [https://cloudbuild.googleapis.com/v1/projects/<GCPのProjectID>/builds/16cab9fd-a4b3-4937-a7a3-7838516788d3].
Logs are available at [https://console.cloud.google.com/gcr/builds/16cab9fd-a4b3-4937-a7a3-7838516788d3?project=168605712006].
---------------------------------------------------- REMOTE BUILD OUTPUT ----------------------------------------------------
starting build "16cab9fd-a4b3-4937-a7a3-7838516788d3"

FETCHSOURCE
BUILD
Already have image (with digest): gcr.io/cloud-builders/git
hoge
PUSH
DONE
-----------------------------------------------------------------------------------------------------------------------------

ID                                    CREATE_TIME                DURATION  SOURCE  IMAGES  STATUS
16cab9fd-a4b3-4937-a7a3-7838516788d3  2019-10-20T02:23:44+00:00  3S        -       -       SUCCESS


> docker-gcloud builds log \
  16cab9fd-a4b3-4937-a7a3-7838516788d3
---------------------------------------------------- REMOTE BUILD OUTPUT ----------------------------------------------------
starting build "16cab9fd-a4b3-4937-a7a3-7838516788d3"

FETCHSOURCE
BUILD
Already have image (with digest): gcr.io/cloud-builders/git
hoge
PUSH
DONE
-----------------------------------------------------------------------------------------------------------------------------
```

カレントディレクトリの`cloudbuild.yaml` をちゃんとみてくれてますね。でけたー


## 環境設定

### コマンドを作成

Google Cloud SDKのDockerイメージは公式から提供されているのでそれを利用します。

google/cloud-sdk - Docker Hub
https://hub.docker.com/r/google/cloud-sdk/


下記を参考にしてDockerコンテナ内で`gcloud` コマンドを実行できるようにします。

Dockerにホームディレクトリをマウントしちゃおう - Qiita
https://qiita.com/74th/items/a3a7d6826a67e8a61608

Dockerコンテナからホスト側カレントディレクトリにアクセス - Qiita
https://qiita.com/yoichiwo7/items/ce2ade791462b4f50cf3


ポイントは以下のとおりです。

- `-v $HOME/.config/gcloud:$HOME/.config/gcloud -e "HOME=$HOME"` で認証情報をホストにあるものを参照
- `-v $PWD:$PWD -w $PWD` でコマンド実行時のカレントディレクトリを指定
- `--entrypoint=gcloud` と`$*` で通常の`gcloud` コマンド実行と同じ挙動を実現

```sh:docker-gcloud
#!/bin/sh
docker run -it --rm \
  -v $HOME/.config/gcloud:$HOME/.config/gcloud \
  -v $PWD:$PWD \
  -e "HOME=$HOME" \
  -w $PWD \
  --entrypoint=gcloud \
  google/cloud-sdk:alpine \
  $*
```

作成したファイルのシンボリックリンクを`/usr/local/bin` にはって実行できるようにします。`/usr/local/bin` が`$PATH` に含まれている前提です。

google/cloud-sdk - Docker Hub
https://hub.docker.com/r/google/cloud-sdk/

Dockerにホームディレクトリをマウントしちゃおう - Qiita
https://qiita.com/74th/items/a3a7d6826a67e8a61608

Dockerコンテナからホスト側カレントディレクトリにアクセス - Qiita
https://qiita.com/yoichiwo7/items/ce2ade791462b4f50cf3

自作のコマンドを作成した - Qiita
https://qiita.com/yoshiken/items/2b8e6c24d6b95e65b625


```console
> chmod +x docker-gcloud
> ln -s docker-gcloud /usr/local/bin/
```

これで最初にあげたように`docker-gcloud` コマンドが実行できるようになります。
`gsutil` コマンドもエントリーポイントを変えてやれば実現できます。

コマンド実行のカレントディレクトリがDockerコンテナで参照できるので、たいていのコマンド実行では問題にならないかなと。
`docker-gcloud` がコマンド打つのに長ったらしいのはエイリアスなんかでどうにでもなります。


## まとめ

使えるかわかりませんが、とりあえずイメージしてたコマンドが出来上がりました。


## 参考

google/cloud-sdk - Docker Hub
https://hub.docker.com/r/google/cloud-sdk/

Dockerにホームディレクトリをマウントしちゃおう - Qiita
https://qiita.com/74th/items/a3a7d6826a67e8a61608

Dockerコンテナからホスト側カレントディレクトリにアクセス - Qiita
https://qiita.com/yoichiwo7/items/ce2ade791462b4f50cf3

自作のコマンドを作成した - Qiita
https://qiita.com/yoshiken/items/2b8e6c24d6b95e65b625