DockerのレジストリとしてはDockerHubが使われるがプライベートが良いよねーでAWSユーザーの人はECRを使うことが多いのかなと思うが GCPだってある。それがContainer Registry(GCR)
個人で開発しているものをGCP上にのせているのでGCRを使っている
この記事のゴール
FROM: Container RegistryレジストリのURL!
作って
$ docker build -t gcr_sample .
したらlocalのimage listに追加される
レジストリへのPUSH
前提として gcloud auth login
はすんでいる状態とします
公式: Container Registry への push
まずlocalにbuildされたイメージがあるとします。 今回は下記のようなものをサンプルとして使用する
FROM busybox CMD echo "GCP!!!"
$ docker build -t asia.gcr.io/[project id]/echo-gcp .
タグの名前は gcr.io/[project_id]/[image-name]
にする必要がある。
gcr.ioに関してはus.gcr.io ,eu.gcr.io, asia.gcr.ioなどがあり、今回は一番近い asia.gcr.io
を使用しています
後は gcloud
コマンドにpush用のコマンドがついているのでそれを使う
$ gcloud docker -- push asia.gcr.io/[projrect_id]/echo-gcp The push refers to a repository [asia.gcr.io/[projrect_id]/echo-gcp] c0de73ac1111: Layer already exists latest: digest: sha256:111111111111111112222222222 size: 527
確認
GCP上からContainer Registryを見ると先ほどのimage nameが表示される
ちなみにイメージなどはGCSにバケットが自動で作られて保存されておりGCSの画面へいくと確認が出来る
PULL
これもgcloudで提供されているので
$ gcloud docker -- pull asia.gcr.io/[project_id]/echo-gcp:latest
でlocalのimageに追加される。
一旦localにない状態に戻すために docker rmi
して
FROM: asia.gcr.io/[project_id]/echo-gcp:latest CMD echo "GCP!! NEO!!"
を作って
$ docker build -t echo-gcr-neo . Error: Status 403 trying to pull repository [project_id]/echo-gcp: "Unable to access the repository: [project_id]/echo-gcp; please verify that it exists and you have permission to access it (no valid credential was supplied)."
gcloudが頑張ってくれていた
pushやpullを gcloud docker
とつけてましたが、これにより本来必要な認証周りをgcloud側で短時間のアクセストークンをわたして認証しているため、ユーザーはgcloudにログインしていれば無駄な手間なくいける。
ただこれだとDockerfileのFROMに記載するためには毎回localに一旦最新を落としてみたいなフローが必要になる。
今回はlocalになくても docker run
したらリモートみにいってほしいから docker login
する
$ docker login -e [メールアドレス] -u oauth2accesstoken -p "$(gcloud auth print-access-token)" https://asia.gcr.io
これでOK !! gcloud auth print-access-token
によりアクセストークンが発行され、それを使って認証する
認証された情報は $HOME/.docker/config.json
に入っている
これでもう一度
$ docker build -t echo-gcr-neo . $ docker run echo-gcr-neo GCP!! NEO!!
でた!!!