Pemecahan masalah

Bagian ini menjelaskan cara memecahkan masalah umum Container Registry dan Docker.

Project cakupan domain

Jika Anda menerima error invalid reference format, salah satu masalahnya mungkin karena Anda memiliki project cakupan domain.

Jika project Anda dicakupkan ke domain, project ID akan menyertakan domain dan titik dua, misalnya: example.com:my-project. Lihat Project cakupan domain untuk mengetahui cara menggunakan project ID yang menyertakan domain.

Error: Status 405: v1 Registry API is disabled.

Jika Anda terus mengalami error seperti "v1 Registry API dinonaktifkan" saat menarik atau mendorong image, pastikan nama host, project ID, nama image, dan tag atau ringkasan Anda dieja dengan benar.

Untuk melihat tag dan ringkasan image, jalankan perintah berikut:

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

Contoh:

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

Untuk mengetahui informasi selengkapnya tentang cara mencantumkan tag dan ringkasan gambar, lihat Mengelola Gambar.

Masalah izin

Bagian berikut menjelaskan solusi untuk masalah izin tertentu. Selalu pastikan Anda memiliki izin yang diperlukan untuk melakukan push atau pull. Lihat Izin dan peran.

Jika telah mengaktifkan akses level bucket seragam di bucket penyimpanan yang digunakan oleh Container Registry, Anda mungkin mengalami masalah akses saat melakukan push dan pull ke Container Registry.

Untuk memperbaiki masalah akses, pastikan Anda memiliki izin yang diperlukan untuk melakukan push atau pull. Izin ini tercantum di Izin dan peran.

Jika Anda mengalami error permission denied, seperti contoh berikut:

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

Anda mungkin perlu menambahkan diri Anda ke grup pengguna docker.

Jalankan perintah berikut di shell atau jendela terminal:

  sudo usermod -a -G docker ${USER}

Mulai ulang sistem setelah menambahkan diri Anda ke grup pengguna docker.

Masalah izin saat berkomunikasi dengan Container Registry

Jika Anda mengalami error izin seperti berikut:

Permission denied: Unable to create the repository, please check that you have access to do so
  1. Pastikan penagihan diaktifkan untuk project Anda.

  2. Verifikasi akses Anda:

    1. Pastikan Anda diautentikasi untuk gcloud dengan menjalankan perintah berikut:

      gcloud init
      
    2. Pastikan Docker dikonfigurasi untuk menggunakan gcloud sebagai helper kredensial Container Registry dengan menjalankan perintah berikut:

      gcloud auth configure-docker
      
    3. Pastikan docker-credential-gcloud dapat dieksekusi:

      docker-credential-gcloud list
      

      Anda akan melihat objek JSON dengan registry target sebagai salah satu kuncinya. Misalnya:

      {
        "https://asia.gcr.io": "oauth2accesstoken",
        "https://eu.gcr.io": "oauth2accesstoken",
        "https://gcr.io": "oauth2accesstoken",
        "https://us.gcr.io": "oauth2accesstoken"
      }
      
    4. Selanjutnya, pastikan Anda memiliki izin untuk menulis ke Cloud Storage di project yang Anda kirim. Jika tidak, minta admin untuk memberikan akses kepada pengguna Anda, lalu coba lagi.

    5. Jika masalah berlanjut setelah Anda memiliki izin yang benar, mungkin token akses Anda diperoleh tanpa salah satu cakupan berikut:

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

      Untuk memverifikasinya, dapatkan token akses sendiri terlebih dahulu. Hal ini bervariasi dari aplikasi ke aplikasi, misalnya jika Anda menggunakan token akses dari akun layanan default Compute Engine, Anda dapat mengikuti petunjuk di sini untuk mendapatkannya.

      Setelah mendapatkan token akses sendiri, Anda dapat menggunakan perintah ini untuk melihat cakupan yang digunakan dalam mendapatkan token akses:

      curl -H "Authorization: Bearer <your access token>" https://www.googleapis.com/oauth2/v1/tokeninfo
      

      Jika cakupan yang disebutkan tidak disertakan, perbaiki masalahnya untuk memastikan untuk menyertakannya saat mendapatkan token akses dalam kode Anda. Misalnya, untuk token yang dihasilkan secara khusus untuk akun layanan default di virtual machine Compute Engine, Anda harus memperbaiki setelan cakupan untuk virtual machine tersebut dan membuatnya ulang.

Masalah izin saat mengirim dan mengambil image

Instance VM yang mendorong atau menarik image harus dikonfigurasi dengan benar dengan izin IAM dan cakupan akses yang diperlukan untuk mengakses bucket penyimpanan Container Registry. Untuk mengetahui informasi tentang setelan yang diperlukan, lihat Menggunakan Container Registry dengan Google Cloud.

Error ImagePullBackoff dari Google Kubernetes Engine

GKE menampilkan error ImagePullBackoff saat tidak dapat mengambil image dari registry. Error mungkin terjadi karena image tidak dapat ditemukan atau karena node Anda tidak memiliki izin untuk mengambil dari registry. Secara default, node GKE memiliki izin untuk mengambil image dari Container Registry jika registry berada di project Google Cloud yang sama dengan node Anda.

Dokumentasi GKE menyertakan langkah-langkah untuk mengidentifikasi penyebab utama dan menyelesaikan masalah.

Penegakan kebijakan organisasi

Batasan kebijakan organisasi dapat memengaruhi penggunaan Container Registry jika berlaku untuk layanan yang digunakan Container Registry, termasuk batasan yang mewajibkan penggunaan kunci enkripsi yang dikelola pelanggan (CMEK).

Error Permintaan Tidak Valid saat mendorong gambar

Jika Cloud Storage API ada dalam daftar kebijakan Deny untuk batasan constraints/gcp.restrictNonCmekServices, Anda tidak dapat mendorong image ke Container Registry jika bucket penyimpanan yang mendasarinya tidak dienkripsi dengan CMEK. Pesan berikut akan ditampilkan:

unknown: Bad Request

Saat constraints/gcp.restrictCmekCryptoKeyProjects dikonfigurasi, bucket penyimpanan harus dienkripsi dengan CryptoKey dari project, folder, atau organisasi yang diizinkan. Bucket yang ada dan tidak mematuhi kebijakan harus dikonfigurasi untuk menggunakan kunci yang diperlukan secara default.

Untuk mengenkripsi bucket penyimpanan, lihat petunjuk Cloud Storage. Nama bucket untuk host registry memiliki salah satu format berikut:

  • artifacts.PROJECT-ID.appspot.com untuk gambar yang disimpan di host gcr.io
  • STORAGE-REGION.artifacts.PROJECT-ID.appspot.com untuk gambar yang disimpan di asia.gcr.io, eu.gcr.io, atau us.gcr.io.

Topik Pub/Sub gcr tidak dibuat secara otomatis

Saat Anda mengaktifkan Container Registry API di project Google Cloud, Container Registry akan mencoba membuat topik Pub/Sub dengan ID topik gcr secara otomatis menggunakan kunci enkripsi yang dikelola Google.

Jika Pub/Sub API ada dalam daftar kebijakan Deny untuk batasan constraints/gcp.restrictNonCmekServices, topik harus dienkripsi dengan CMEK. Permintaan untuk membuat topik tanpa enkripsi CMEK akan gagal.

Untuk membuat topik gcr dengan enkripsi CMEK, lihat petunjuk untuk mengenkripsi topik Pub/Sub.

Batas Kuota

Jika melebihi batas kuota Container Registry, Anda mungkin melihat pesan error seperti ini:

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

Untuk menghindari melebihi batas kuota tetap, Anda dapat:

  • Meningkatkan jumlah alamat IP yang berkomunikasi dengan Container Registry. Kuota ditetapkan per alamat IP.
  • Menambahkan percobaan ulang yang menyebabkan penundaan. Misalnya, Anda dapat menggunakan backoff eksponensial.

Endpoint registry tidak valid dengan boot2docker

Jika Anda mengalami masalah saat menjangkau Container Registry dari lingkungan boot2docker:

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

Anda mungkin perlu memulai ulang boot2docker:

boot2docker stop
boot2docker start

Error saat mendorong gambar tingkat root

Saat Anda mencoba melakukan push pada image penampung, push akan gagal dengan pesan yang menyertakan:

Pushing to root-level images is disabled

Pesan ini menunjukkan bahwa Anda memberi tag pada gambar dengan nama host dan image, tetapi tidak menyertakan project ID.

Beri tag pada gambar menggunakan format jalur gambar yang benar:

HOSTNAME/PROJECT-ID/IMAGE:TAG

Misalnya: gcr.io/web-project/web-app:1.0.

Docker di Mac

Jika mengalami masalah dengan Docker di Mac, Anda mungkin perlu mencoba solusi. Error dapat mencakup operasi push/pull Docker yang tidak responsif, atau error jaringan yang mirip dengan berikut:

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

Jika Anda mengalami error ini, coba langkah-langkah berikut:

  • Jalankan perintah docker-machine restart default di terminal Mac untuk memulai ulang daemon Docker.

  • Pastikan "Simpan login docker dengan aman di keychain macOS" tidak diaktifkan di menu Preferensi Docker.

  • Pastikan Anda menjalankan Docker versi terbaru.