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 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-menerus mengalami error seperti "v1 Registry API is disabled" saat mengambil atau mengirim image, pastikan nama host, project ID, nama image, dan tag atau ringkasan dieja dengan benar.

Untuk melihat tag dan ringkasan gambar Anda, 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 mencantumkan tag dan ringkasan gambar, lihat Mengelola Gambar.

Masalah izin

Bagian berikut menjelaskan solusi untuk masalah izin tertentu. Selalu pastikan bahwa Anda memiliki izin yang diperlukan untuk mendorong atau menarik. Lihat Izin dan peran.

Jika Anda telah mengaktifkan akses level bucket seragam pada bucket penyimpanan yang digunakan oleh Container Registry, Anda mungkin mengalami masalah akses saat mendorong dan menarik ke Container Registry.

Untuk memperbaiki masalah akses, pastikan Anda memiliki izin yang diperlukan untuk mendorong atau menarik. Izin ini tercantum dalam 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 jendela shell atau terminal Anda:

  sudo usermod -a -G docker ${USER}

Mulai ulang sistem Anda 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 telah 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 dijalankan:

      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 menjadi tujuan Anda. Jika belum, minta admin untuk memberikan akses kepada pengguna Anda, lalu coba lagi.

    5. Jika masalah terus berlanjut setelah Anda mendapatkan 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 sendiri token akses terlebih dahulu. Opsi ini bervariasi untuk setiap aplikasi. Misalnya, jika Anda menggunakan token akses dari akun layanan default Compute Engine, Anda dapat mengikuti petunjuk di sini untuk mendapatkannya.

      Setelah memperoleh token akses sendiri, Anda dapat menggunakan perintah ini untuk melihat cakupan yang digunakan untuk 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 dan pastikan untuk menyertakannya saat mendapatkan token akses dalam kode Anda. Misalnya, untuk token yang dibuat khusus untuk akun layanan default di virtual machine Compute Engine, Anda harus memperbaiki setelan cakupan untuk virtual machine tersebut dan membuatnya kembali.

Masalah izin saat mendorong dan mengambil gambar

Instance VM yang mengirim atau mengambil image harus dikonfigurasi dengan benar menggunakan cakupan akses dan izin IAM yang diperlukan agar dapat 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 jika tidak dapat mengambil image dari registry. Error ini mungkin terjadi karena gambar 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 saat registry berada dalam project Google Cloud yang sama dengan node Anda.

Dokumentasi GKE mencakup langkah-langkah untuk mengidentifikasi akar penyebab dan menyelesaikan masalah.

Penegakan kebijakan organisasi

Batasan kebijakan organisasi dapat memengaruhi penggunaan Container Registry saat diterapkan ke layanan yang digunakan Container Registry, termasuk batasan yang mengharuskan penggunaan kunci enkripsi yang dikelola pelanggan (CMEK).

Error Permintaan Buruk saat mengirim gambar

Saat Cloud Storage API tercantum dalam daftar kebijakan Deny untuk batasan constraints/gcp.restrictNonCmekServices, Anda tidak dapat mengirim gambar ke Container Registry jika bucket penyimpanan yang mendasarinya tidak dienkripsi dengan CMEK. Pesan berikut ditampilkan:

unknown: Bad Request

Jika constraints/gcp.restrictCmekCryptoKeyProjects dikonfigurasi, bucket penyimpanan harus dienkripsi dengan Bigtable 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 gcr.io host
  • 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 secara otomatis dengan ID topik gcr 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."

Agar tidak melebihi batas kuota tetap, Anda dapat:

  • Meningkatkan jumlah alamat IP yang terhubung dengan Container Registry. Kuota adalah per alamat IP.
  • Tambahkan 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 mengirim image tingkat root

Saat Anda mencoba mengirim image container, push tersebut akan gagal dengan pesan yang menyertakan:

Pushing to root-level images is disabled

Pesan ini menunjukkan bahwa Anda sudah memberi tag pada gambar dengan nama host dan gambar, 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 ini:

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.