tl:dr
gcr.ioにサービスアカウントでpushする方法がわかんなかったので調べた。
- サービスアカウント(JWT)発行
- containerが保存されているbucketのWrite権限を与える
$ gcloud auth activate-service-account --key-file $json_file
$ gcloud docker push ${image}
概要
同一GCP Projectなら何も考えずに docker pushできるけど
別プロジェクトだと出来ないからservice account使ってよろしくやる。
結局IAMにどのpermissionが必要か?
サービスアカウントにどんな権限が必要なのか調べたら
containerが保存されているgoogle strageのRead/Write権限
とのこと
google container registryを利用してるProjectの
bucket listを覗いてるとなんかそれっぽいbucketができてる
container bucketに作ったサービスアカウントのWrite権限を追加する
e.g. artifacts.your_project.appspot.com
docker push
$ docker build -t gcr.io/your_project/sugoi-container:latest .
$ gcloud auth activate-service-account --key-file $json_file
$ gcloud docker push gcr.io/your_project/sugoi-container:latest
Jenkins Pipelineでやる場合
おまけ
前提
- jenkinsにsecret fileとしてサービスアカウントのJWTを登録しておく
- e.g.
gcr-key
- e.g.
- jenkinsは
gcloud
commandが実行可能
def imageTag = "gcr.io/your_project/image:build-${env.BUILD_NUMBER}"
docker.build("${imageTag}")
withCredentials([[$class: 'FileBinding', credentialsId: 'gcr-key', variable: 'JSON_KEY']]) {
sh 'gcloud auth activate-service-account --key-file $JSON_KEY'
}
sh("gcloud docker push ${imageTag}")
jenkinsにgcloudコマンド入れたくないよって場合 docker login使う方法もある。
追記
gcloud auth activate-service-accountすると
gcloud commandのアカウントが切り替わった状態になるので注意すること。
参考資料
docker login使う方法とかも書いてる
https://cloud.google.com/container-registry/docs/advanced-authentication