Google Container Registry (GCR) にDockerイメージをプッシュしようとしてエラーが出たときの対応
はじめに
独自にビルドした Docker イメージは、Docker Repository に配置して初めて自分以外も利用できるようになります。
パブリックな Docker Repository としては Docker Hub が有名です。
プライベートな Docker Repository として、僕は Google Container Registry (GCR) を利用することが多いです。
先日、他の方から 「Google Container Registry にビルドイメージをプッシュしようとしてエラーが出てハマっている」という相談がありましたので、こちらの解消方法について解説しようと思いました。
検証環境
作業の流れ
gcloud
+docker
コマンドのインストール- Docker イメージを作成
- GCR に対する認証を設定
- Docker イメージをプッシュ
- Docker イメージをプル + 実行
1. gcloud
+ docker
コマンドのインストール
gcloud
は "Google Container Registry (GCR)" に対して「認証」を行うために利用します。
GCR に対する「認証」が完了すれば、そのホストから docker
コマンドを使って Docker イメージをビルドし、プッシュできます。
それでは、 gcloud
コマンドのインストールから行います。
( 本題ではないのでさらっと進みます。 )
次に、 docker
コマンドのインストールを行います。
( 同様に本題ではないのでさらっと進みます。 )
改めて Vagrant 環境に ssh でログインし、 docker
コマンドが利用できるようになっているか確認してみます。
公式の hello-world という Docker イメージを実行してみます。
2. Docker イメージを作成
Docker イメージをビルドします。
適当な Dockerfile
を作成します。
GCR にイメージをプッシュする場合は、ビルド時に gcr.io/<GCPプロジェクト名>/<イメージ名>:<タグ>
というイメージ名でビルドする必要があります。
今回は タグを省略しています が、この場合自動的に latest
というタグが付与されます。
今回利用する僕の GCP プロジェクトは genzouw-com となりましたが、ここは各自お使いの GCP プロジェクト名を指定しましょう。
ビルドしたばかりのイメージを実行してみます。
メッセージが表示され、 問題なく動作することがわかりました。
作成されたイメージをプッシュしてみます。
当然ですが、GCR に対する認証エラーとなります。 (エラーにならなかったらだれでも GCR を更新できてしまうので問題です。)
3. GCR に対する認証設定
GCR にイメージをプッシュできるように認証を行います。
gcloud
コマンドを使うための初期設定を行います。
GCR に対してビルドイメージをプッシュできるように認証を行います。
完了しました。
認証設定は ~/.docker/config.json
に保存されます。
4. Docker イメージをプッシュ
再度 GCR にイメージをプッシュします。
$ docker push gcr.io/genzouw-com/hello-gcr-iamge
Using default tag: latest
The push refers to repository [gcr.io/genzouw-com/hello-gcr-iamge]
5216338b40a7: Layer already exists
latest: digest: sha256:**************************************************************** size: 528
先程は失敗しましたが、今度はプッシュできました。
しかし、環境によっては このタイミングでまだエラーが発生する場合があります。
GCR の実態は Google Cloud Storage というストレージサービスですが、 Cloud Storage のバケット( 以下を参照 )に対する書き込み権限( roles/storage.legacyBucketWriter
)がないと docker push
実行時にエラーが発生します。
gs://artifacts.<GCPプロジェクト名>.appspot.com
今回は gs://artifacts.genzouw-com.appspot.com
というバケットに対して書き込みが行われることとなります。
幸いにも僕は上記のバケットに対して書き込み権限がありました。
権限が付与されていない場合には割当が必要です。
設定は Cloud Storage の管理ページから行ってください。 (ごめんなさい。大事なことなのですが今回は割愛します。エントリの作成作業に力尽きてきました。)
5. Docker イメージをプル + 実行
最後に動作確認のため、GCR からイメージをプルしてみましょう。
ローカルにイメージが残っているとそちらが利用され、GCR との通信が行われません。
動作確認を目的としているので、残っているイメージを事前に削除します。
削除できたら、 docker run
で実行します。
ローカルにイメージがないため、初回のみ GCR から自動的にプルします。
正常に動作しました!
ひとこと
Cloud Storage への書き込み権限の設定が非常に大事なのにも関わらず、省略してしまいました。
ごめんなさい。エントリをまとめているうちに力尽きたというのもあります。
この点については「サービスアカウント」を作成してそちらを利用するのが良いのですがその方法についてはまた別途紹介します。
ディスカッション
コメント一覧
まだ、コメントがありません