トラブルシューティング

ここでは、Container Registry と Docker の一般的な問題のトラブルシューティング方法について説明します。

ドメインをスコープとするプロジェクト

エラー invalid reference format が表示された場合、ドメインをスコープとするプロジェクトがある可能性があります。

プロジェクトでドメインをスコープとしている場合、プロジェクト ID にドメインとコロンが含まれます(例: example.com:my-project)。ドメインが含まれるプロジェクト ID の処理方法については、ドメインをスコープとするプロジェクトをご覧ください。

エラー: ステータス 405: "v1 Registry API is disabled."

イメージを pull または push するときに「v1 Registry API is disabledv」などのエラーが連続して発生する場合は、ホスト名、プロジェクト ID、イメージ名、タグ、ダイジェストのスペルが正しいことを確認してください。

イメージのタグとダイジェストを表示するには、次のコマンドを実行します。

gcloud container images list-tags [HOSTNAME]/[PROJECT-ID]/[IMAGE]

例:

gcloud container images list-tags gcr.io/my-project/my-image

イメージのタグとダイジェストを表示する方法について詳しくは、イメージの管理をご覧ください。

権限の問題

以下のセクションでは、特定の権限の問題が発生した場合の解決方法を説明します。push または pull に必要な権限があることを必ず確認してください。権限と役割をご覧ください。

Container Registry で使用されているストレージ バケットでバケット ポリシーのみを有効にしている場合、Container Registry に対して push または pull を行うときにアクセス権の問題が生じることがあります。

アクセス権の問題を解決するには、push または pull に必要な権限を取得する必要があります。必要な権限については、権限と役割をご覧ください。

次の例のように、permission denied エラーが発生した場合:

FATA[0000] Post http://var/run/docker.sock/v1.17/images/gcr.io/container-engine-docs/example/push?tag=: dial unix /var/run/docker.sock: permission denied
ERROR: (gcloud.docker) A Docker command did not run successfully.
Tried to run: 'docker push gcr.io/container-engine-docs/example'
Exit code: 1

この問題は、docker ユーザー グループに自分のユーザー名を追加すると解決する可能性があります。

シェルまたはターミナル ウィンドウで次のコマンドを実行します。

  sudo usermod -a -G docker ${USER}

docker ユーザー グループに自分のユーザー名を追加したら、システムを再起動します。

Container Registry と通信する際の権限の問題

以下のような権限エラーが発生することがあります。

Permission denied: Unable to create the repository, please check that you have access to do so
  1. プロジェクトで課金が有効になっていることを確認します。

  2. アクセス権を確認します。

    1. 次のコマンドを実行して、gcloud で認証されていることを確認します。

      gcloud init
      
    2. 次のコマンドを実行して、Container Registry 認証情報ヘルパーとして gcloud を使用するように Docker が構成されていることを確認します。

      gcloud auth configure-docker
      
    3. docker-credential-gcloud を実行できることを確認します。

      docker-credential-gcloud list

      キーの 1 つとしてターゲット レジストリがある JSON オブジェクトが表示されます。例:

      {
        "https://asia.gcr.io": "oauth2accesstoken",
        "https://eu.gcr.io": "oauth2accesstoken",
        "https://gcr.io": "oauth2accesstoken",
        "https://staging-k8s.gcr.io": "oauth2accesstoken",
        "https://us.gcr.io": "oauth2accesstoken"
      }
      
    4. 次に、push 先のプロジェクトで Cloud Storage に対する書き込み権限があることを確認します。書き込み権限がない場合は、管理者にこの権限を付与してもらってから、もう一度お試しください。

    5. 適切な権限が付与されても問題が解決されない場合は、アクセス トークンを取得する際に、次のいずれかのスコープが使用されていない可能性があります。

      • https://www.googleapis.com/auth/devstorage.read_write
      • https://www.googleapis.com/auth/devstorage.full_control

      これがエラーの原因となっているかどうかを確認するには、まず、自分でアクセス トークンを取得します。アプリケーションによって異なりますが、たとえば Compute Engine のデフォルト サービス アカウントから取得したアクセス トークンを使用している場合は、アクセス トークンを取得するための手順に従います。

      アクセス トークンを取得した後、次のコマンドを使用することで、アクセス トークンを取得する際に使用されたスコープを確認できます。

      curl https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=<your access token>
      

      上述のスコープが含まれていない場合、問題を解決するには、コードでアクセス トークンを取得する際にスコープが含まれるようにしてください。たとえば、Compute Engine 仮想マシン上でデフォルト サービス アカウント専用に生成されたトークンの場合、その仮想マシンのスコープ設定を修正してからトークンを再作成する必要があります。

割り当て制限

Container Registry の割り当て制限に達すると、次のようなエラー メッセージが表示されることがあります。

Error: Status 429 trying to pull repository [...] "Quota Exceeded."

固定割り当て制限に達するのを避けるには、次のようにします。

  • Container Registry と通信する IP アドレスの数を増やします。割り当ては IP アドレス単位です。
  • 遅延を導入する再試行を追加します。たとえば、指数バックオフを使用できます。

boot2docker での無効なレジストリ エンドポイント

boot2docker 環境から Container Registry に到達する際に問題が発生したときは、次のようにします。

docker push gcr.io/example/sample

Error response from daemon: invalid registry endpoint https://gcr.io/v0/:
  unable to ping registry endpoint https://gcr.io/v0/
v2 ping attempt failed with error: Get https://gcr.io/v2/:
  x509: certificate has expired or is not yet valid
v1 ping attempt failed with error: Get https://gcr.io/v1/_ping:
  x509: certificate has expired or is not yet valid.
If this private registry supports only HTTP or HTTPS with an unknown CA
certificate, please add `--insecure-registry gcr.io` to the daemon's
arguments. In the case of HTTPS, if you have access to the registry's CA
certificate, no need for the flag; simply place the CA certificate at
/etc/docker/certs.d/gcr.io/ca.crt

boot2docker の再起動が必要になることがあります。

boot2docker stop
boot2docker start

Mac 上の Docker

Mac 上の Docker で問題が発生した場合は、回避策を試すことが必要になる場合があります。Docker push / pull オペレーションに応答していないことが原因のエラーや、次のようなネットワーク エラーが発生する場合があります。

Post https://us.gcr.io/v2/[repo name]/blobs/uploads/: dial tcp xx.xxx.xx.xx:xxx: i/o timeout

このようなエラーが発生した場合の手順は次のとおりです。

  • Mac ターミナルで docker-machine restart default コマンドを実行して、Docker デーモンを再起動します。

  • Docker の [設定] メニューで [macOS キーチェーンに Docker ログインを安全に保存する] が有効になっていないことを確認します。

  • 最新の Docker バージョンを実行していることを確認します。

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...