存在しない Docker イメージを GCR から pull したときのエラーがわかりづらい件

いきなり結論から言うと 「pull しようとしている image は本当に Docker Registory に存在しますか? Registory の URL に間違いは無いですか??」 ってハナシ ᔦꙬᔨ


デプロイフローをええ感じにするぞ的なタスクの一環で、Google Container Registry に置いた Docker コンテナイメージを使って、 Kubernetes の Pod を作ろうとしていた。 が、 Running になった Pod 達がいるなかで ImagePullBackOff でうまく立ち上がらない Pod 達がいた。

$ kubectl get pods
NAME                          READY     STATUS             RESTARTS   AGE
profile-api-457250799-bqcqv   0/1       ImagePullBackOff   0          5h
...

kubectl describe pod して Events の出力結果を確認してみると、以下のようなメッセージが。

Failed to pull image "asia.gcr.io/project-123456/profile-api:latest": rpc error: 
code = 2 desc = Error: Status 405 trying to pull repository project-123456/profile-api: 
"v1 Registry API is disabled. If you are not explicitly using the v1 Registry API,
it is possible your v2 image could not be found. Verify that your image is available,
or retry with `dockerd --disable-legacy-registry`.
See https://cloud.google.com/container-registry/docs/support/deprecation-notices"

ん???

エラーメッセージでググると、古い API や古い Docker クライアントがサポート対象外になったよ、っていうドキュメントが見つかる。

が、ついさっき Docker version 1.10.0-circleci な環境で docker build して、 gcloud docker -- push したばかりだぞ。ドキュメントに記載のバージョンやら、 build & push やらを一通りやりなおしてみたものの、状況は変わらず。どこがいけないのか原因が良くわからなかった。

アレコレいじっている最中に、ふと Registory の URL をブラウザで開いてイメージ一覧を表示してみたところ、

そもそも GCR 上にイメージが存在しなかった 😇

まじかよ…


試しにブラウザで、わざと GCR上 には存在しないイメージ名の URL を叩いてみると、以下のように「サポート対象外となった Docker v1 イメージが含まれています。」というメッセージが表示された……!

どうやら「イメージは存在しない」というメッセージにはならないようで、 Kubernetes が叩いている API でも同様の結果が返っているのではないかと。わかりづらい!!

サポート対象の環境のはずなのにおかしいなと思ったら

  • イメージは GCR 上に存在しているか
  • 取得先の Registory の URL / イメージ名を間違えていないか

を確認しましょうというお話でした。


で、なんで必要なイメージが GCR に居ない状況ができてしまったのかというと、

  1. アプリ本体のリポジトリがある事情で 2 つに分かれており
  2. そのうちの片方でしか CI によるビルドを実行せず (docker build & push)
  3. しかし apply した yml ファイルには 2 リポジトリ分の全ての Pod 定義がかかれていたから

…(ŏ﹏ŏ。)

存在を忘れていたリポジトリにも CI 連携を設定 & ビルド実行し、必要な全イメージが GCR 上に配置され、今度は無事に全 Pod が Running 状態になりましたとさ。


comments powered by Disqus