Tanya jawab umum - Azure Container Registry

Artikel ini membahas tanya jawab umum dan masalah lain yang diketahui tentang Azure Container Registry.

Untuk panduan pemecahan masalah registri, lihat:

Manajemen sumber daya

Bisakah saya membuat Azure Container Registry menggunakan templat Resource Manager?

Ya. Berikut adalah templat yang bisa Anda gunakan untuk membuat registri.

Apakah ada pemindaian kerentanan keamanan untuk gambar di ACR?

Ya. Lihat dokumentasi dari Pertahanan Microsoft untuk Cloud, Twistlock, dan Aqua.

Bagaimana cara mengonfigurasi Kubernetes dengan Azure Container Registry?

Lihat dokumentasi untuk Kubernetes dan langkah-langkah untuk Azure Kubernetes Service.

Bagaimana cara mendapatkan kredensial admin untuk registri kontainer?

Penting

Akun pengguna admin dideasain agar satu pengguna dapat mengakses registri, terutama untuk tujuan pengujian. Kami tidak menyarankan berbagi info masuk akun admin dengan banyak pengguna. Identitas individu direkomendasikan untuk pengguna dan perwakilan layanan untuk skenario headless. Lihat Gambaran autentikasi.

Sebelum mendapatkan kredensial admin, pastikan pengguna admin registri diaktifkan.

Untuk mendapatkan kredensial menggunakan Azure CLI:

az acr credential show -n myRegistry

Menggunakan Azure PowerShell:

Invoke-AzureRmResourceAction -Action listCredentials -ResourceType Microsoft.ContainerRegistry/registries -ResourceGroupName myResourceGroup -ResourceName myRegistry

Bagaimana cara mendapatkan kredensial admin di templat Resource Manager?

Penting

Akun pengguna admin dideasain agar satu pengguna dapat mengakses registri, terutama untuk tujuan pengujian. Kami tidak menyarankan berbagi info masuk akun admin dengan banyak pengguna. Identitas individu direkomendasikan untuk pengguna dan perwakilan layanan untuk skenario headless. Lihat Gambaran autentikasi.

Sebelum mendapatkan kredensial admin, pastikan pengguna admin registri diaktifkan.

Untuk mendapatkan kata sandi pertama:

{
    "password": "[listCredentials(resourceId('Microsoft.ContainerRegistry/registries', 'myRegistry'), '2017-10-01').passwords[0].value]"
}

Untuk mendapatkan kata sandi kedua:

{
    "password": "[listCredentials(resourceId('Microsoft.ContainerRegistry/registries', 'myRegistry'), '2017-10-01').passwords[1].value]"
}

Penghapusan replikasi gagal dengan status Terlarang meskipun replikasi dihapus menggunakan Azure CLI atau Azure PowerShell

Kesalahan terlihat ketika pengguna memiliki izin pada registri tetapi tidak memiliki izin tingkat Pembaca pada langganan. Untuk mengatasi masalah ini, tetapkan izin Pembaca pada langganan ke pengguna:

az role assignment create --role "Reader" --assignee user@contoso.com --scope /subscriptions/<subscription_id> 

Aturan firewall berhasil diperbarui tetapi tidak berlaku

Butuh beberapa waktu untuk menyebarluaskan perubahan aturan firewall. Setelah Anda mengubah pengaturan firewall, harap tunggu beberapa menit sebelum memverifikasi perubahan ini.

Operasi registri

Bagaimana cara mengakses Docker Registry HTTP API V2?

ACR mendukung Docker Registry HTTP API V2. API dapat diakses di https://<your registry login server>/v2/. Contoh: https://mycontainerregistry.azurecr.io/v2/

Bagaimana cara menghapus semua manifes yang tidak direferensikan oleh tag apa pun di repositori?

Jika Anda berada di bash:

az acr manifest list-metadata --name myRepository --registry myRegistry --query "[?tags[0]==null].digest" --output tsv  | xargs -I% az acr repository delete --name myRegistry ---image myRepository@%

Untuk PowerShell:

az acr manifest list-metadata --name myRepository --repository myRegistry --query "[?tags[0]==null].digest" --output tsv | %{ az acr repository delete --name myRegistry --image myRepository@$_ }

Catatan

Anda dapat menambahkan -y dalam perintah hapus untuk melompati konfirmasi.

Untuk informasi selengkapnya, lihat Menghapus gambar kontainer di Azure Container Registry.

Mengapa penggunaan kuota registri tidak berkurang setelah menghapus gambar?

Situasi ini dapat terjadi jika lapisan yang mendasarinya masih dirujuk oleh gambar kontainer lainnya. Jika Anda menghapus gambar tanpa referensi, penggunaan registri akan diperbarui dalam beberapa menit.

Bagaimana cara memvalidasi perubahan kuota penyimpanan?

Membuat gambar dengan lapisan 1GB menggunakan file docker berikut. Ini memastikan bahwa gambar memiliki lapisan yang tidak dibagikan oleh gambar lain di registri.

FROM alpine
RUN dd if=/dev/urandom of=1GB.bin  bs=32M  count=32
RUN ls -lh 1GB.bin

Buat dan dorong gambar ke registri Anda menggunakan CLI docker.

docker build -t myregistry.azurecr.io/1gb:latest .
docker push myregistry.azurecr.io/1gb:latest

Anda harus dapat melihat bahwa penggunaan penyimpanan telah meningkat di portal Microsoft Azure, atau Anda dapat meminta penggunaan menggunakan CLI.

az acr show-usage -n myregistry

Hapus gambar menggunakan Azure CLI atau portal dan periksa penggunaan yang diperbarui dalam beberapa menit.

az acr repository delete -n myregistry --image 1gb

Bagaimana cara mengautentikasi dengan registri saya saat menjalankan CLI dalam kontainer?

Anda perlu menjalankan kontainer Azure CLI dengan memasang soket Docker:

docker run -it -v /var/run/docker.sock:/var/run/docker.sock azuresdk/azure-cli-python:dev

Dalam kontainer, instal docker:

apk --update add docker

Kemudian autentikasi dengan registri Anda:

az acr login -n MyRegistry

Bagaimana cara mengaktifkan TLS 1.2?

Aktifkan TLS 1.2 dengan menggunakan klien docker terbaru (versi 18.03.0 atau yang lebih baru).

Penting

Mulai 13 Januari 2020, Azure Container Registry akan memerlukan semua koneksi aman dari server dan aplikasi untuk menggunakan TLS 1.2. Dukungan untuk TLS 1.0 dan 1.1 akan dihentikan.

Apakah Azure Container Registry mendukung Content Trust?

Ya, Anda dapat menggunakan gambar tepercaya di Azure Container Registry, karena Docker Notary telah terintegrasi dan dapat diaktifkan. Untuk detailnya, lihat Content Trust di Azure Container Registry.

Di mana file untuk sidik jari berada?

Di bawah ~/.docker/trust/tuf/myregistry.azurecr.io/myrepository/metadata:

  • Kunci dan sertifikat publik dari semua peran (kecuali peran delegasi) disimpan di root.json.
  • Kunci dan sertifikat publik dari peran delegasi disimpan dalam file JSON peran induknya (misalnya targets.json untuk peran targets/releases).

Disarankan untuk memverifikasi kunci publik dan sertifikat tersebut setelah verifikasi TUF keseluruhan yang dilakukan oleh klien Docker dan Notary.

Bagaimana cara memberikan akses untuk menarik atau mendorong gambar tanpa izin untuk mengelola sumber daya registri?

ACR mendukung peran kustom yang menyediakan tingkat izin yang berbeda. Secara khusus, peran AcrPull dan AcrPush memungkinkan pengguna untuk menarik dan/atau mendorong gambar tanpa izin untuk mengelola sumber daya registri di Azure.

  • Portal Azure: Registri Anda > Kontrol Akses (IAM) -> Tambahkan (Pilih AcrPull atau AcrPush untuk Peran).

  • Azure CLI: Temukan ID sumber daya registri dengan menjalankan perintah berikut:

    az acr show -n myRegistry
    

    Kemudian Anda dapat menetapkan AcrPull atau peran AcrPush kepada pengguna (contoh berikut menggunakan AcrPull):

    az role assignment create --scope resource_id --role AcrPull --assignee user@example.com
    

    Atau, tetapkan peran ke perwakilan layanan yang diidentifikasi oleh ID aplikasinya:

    az role assignment create --scope resource_id --role AcrPull --assignee 00000000-0000-0000-0000-000000000000
    

Penerima tugas kemudian dapat mengautentikasi dan mengakses gambar dalam registri.

  • Untuk mengotentikasi ke registri:

    az acr login -n myRegistry 
    
  • Untuk mencantumkan repositori:

    az acr repository list -n myRegistry
    
  • Untuk menarik gambar:

    docker pull myregistry.azurecr.io/hello-world
    

Dengan hanya menggunakan peran AcrPull atau AcrPush, penerima tugas tidak memiliki izin untuk mengelola sumber daya registri di Azure. Misalnya, az acr list atau az acr show -n myRegistry tidak akan menampilkan registri.

Bagaimana cara mengaktifkan karantina gambar otomatis untuk registri?

Karantina gambar saat ini merupakan fitur pratinjau ACR. Anda dapat mengaktifkan mode karantina registri sehingga hanya gambar yang berhasil melewati pemindaian keamanan yang terlihat oleh pengguna normal. Untuk detailnya, lihat repo ACR GitHub.

Bagaimana cara mengaktifkan akses penarikan anonim?

Untuk informasi selengkapnya, lihat Membuat konten registri Anda tersedia untuk umum.

Bagaimana cara mendorong lapisan yang tidak dapat didistribusikan ke registri?

Lapisan yang tidak dapat didistribusikan dalam manifes berisi parameter URL tempat konten tersebut dapat diambil. Beberapa kemungkinan kasus penggunaan untuk mengaktifkan dorongan lapisan yang tidak dapat didistribusikan adalah untuk registri terbatas jaringan, registri bercelah udara dengan akses terbatas, atau untuk registri tanpa konektivitas internet.

Misalnya, jika Anda memiliki aturan NSG yang disiapkan sehingga VM hanya dapat menarik gambar dari registri kontainer Azure Anda, Docker akan menarik kegagalan untuk lapisan asing/yang tidak dapat didistribusikan. Misalnya, gambar Windows Server Core akan berisi referensi lapisan asing ke registri kontainer Azure dalam manifesnya dan akan gagal menarik skenario ini.

Untuk mengaktifkan mendorong lapisan yang tidak dapat didistribusikan:

  1. Edit file daemon.json, yang terletak di /etc/docker/ host Linux dan di C:\ProgramData\docker\config\daemon.json pada Windows Server. Dengan berasumsi file sebelumnya kosong, tambahkan konten berikut:

    {
      "allow-nondistributable-artifacts": ["myregistry.azurecr.io"]
    }
    

    Catatan

    Nilainya adalah array alamat registri, yang dipisahkan oleh koma.

  2. Simpan dan keluar dari file.

  3. Mulai ulang Docker.

Ketika Anda mendorong gambar ke registri dalam daftar, lapisan yang tidak dapat didistribusikan mereka didorong ke registri.

Peringatan

Artefak yang tidak dapat didistribusikan biasanya memiliki batasan tentang cara dan tempat artefak tersebut dapat didistribusikan dan dibagikan. Gunakan fitur ini hanya untuk mendorong artefak ke registri privat. Pastikan Anda mematuhi setiap persyaratan yang mencakup mendistribusikan kembali artefak yang tidak dapat didistribusikan.

Aktivitas diagnostik dan kesehatan

Periksa kesehatan dengan 'az acr check-health'

Untuk memecahkan masalah registri dan lingkungan umum, lihat Memeriksa kesehatan registri kontainer Azure.

Penarikan Docker gagal dengan kesalahan: net/http: permintaan dibatalkan saat menunggu koneksi (Client.Timeout terlampaui saat menunggu header)

  • Jika kesalahan ini adalah masalah sementara, maka coba lagi akan berhasil.
  • Jika docker pull gagal terus menerus, mungkin ada masalah dengan daemon Docker. Masalah umumnya dapat dimitigasi dengan memulai kembali daemon Docker.
  • Jika Anda terus melihat masalah ini setelah memulai ulang daemon Docker, masalahnya mungkin saja beberapa isu konektivitas jaringan dengan komputer. Untuk memeriksa apakah jaringan umum pada komputer sehat, jalankan perintah berikut untuk menguji konektivitas titik akhir. Versi az acr minimum yang berisi perintah pemeriksaan konektivitas ini adalah 2.2.9. Mutakhirkan Azure CLI jika Anda menggunakan versi yang lebih lama.
az acr check-health -n myRegistry
  • Anda harus selalu memiliki mekanisme coba lagi pada semua operasi klien Docker.

Penarikan Docker lambat

Gunakan alat kecepatan untuk menguji kecepatan pengunduhan jaringan mesin Anda. Jika jaringan mesin lambat, pertimbangkan untuk menggunakan Azure VM di wilayah yang sama dengan registri Anda untuk meningkatkan kecepatan jaringan.

Docker push lambat

Gunakan alat kecepatan untuk menguji kecepatan unggah jaringan mesin Anda. Jika jaringan mesin lambat, pertimbangkan untuk menggunakan Azure VM di wilayah yang sama dengan registri Anda untuk meningkatkan kecepatan jaringan.

Docker push berhasil tetapi penarikan docker gagal dengan kesalahan: tidak sah: autentikasi diperlukan

Kesalahan ini dapat terjadi dengan daemon Docker versi Red Hat, di mana --signature-verification diaktifkan secara default. Anda dapat memeriksa opsi daemon Docker untuk Red Hat Enterprise Linux (RHEL) atau Fedora dengan menjalankan perintah berikut:

grep OPTIONS /etc/sysconfig/docker

Misalnya, Fedora 28 Server memiliki opsi daemon docker berikut:

OPTIONS='--selinux-enabled --log-driver=journald --live-restore'

Dengan --signature-verification=false hilang, docker pull gagal dengan kesalahan yang mirip dengan:

Trying to pull repository myregistry.azurecr.io/myimage ...
unauthorized: authentication required

Untuk mengatasi masalah ini:

  1. Tambahkan opsi --signature-verification=false ke file konfigurasi daemon Docker /etc/sysconfig/docker. Contohnya:

    OPTIONS='--selinux-enabled --log-driver=journald --live-restore --signature-verification=false'

  2. Mulai ulang layanan daemon Docker dengan menjalankan perintah berikut:

    sudo systemctl restart docker.service
    

Detail --signature-verification dapat ditemukan dengan menjalankan man dockerd.

az acr login berhasil tetapi docker gagal dengan kesalahan: tidak sah: autentikasi diperlukan

Pastikan Anda menggunakan URL server semua huruf kecil, misalnya, docker push myregistry.azurecr.io/myimage:latest, bahkan jika nama sumber daya registri adalah huruf besar atau gabungan huruf besar dan kecil, seperti myRegistry.

Mengaktifkan dan mendapatkan log debug daemon Docker

Mulai dockerd dengan opsi debug. Pertama, buat file konfigurasi daemon Docker (/etc/docker/daemon.json) jika tidak ada, dan tambahkan opsi debug:

{    
    "debug": true    
}

Kemudian, mulai ulang daemon. Misalnya, dengan Ubuntu 14.04:

sudo service docker restart

Detail dapat ditemukan dalam dokumentasi Docker.

  • Log dapat dihasilkan di lokasi yang berbeda, tergantung sistem Anda. Misalnya, untuk Ubuntu 14.04, itu /var/log/upstart/docker.log.
    Lihat dokumentasi Docker untuk mengetahui detailnya.

  • Untuk Docker untuk Windows, log dihasilkan di bawah %LOCALAPPDATA%/docker/. Namun ini mungkin belum berisi semua informasi debug.

    Untuk mengakses log daemon lengkap, Anda mungkin memerlukan beberapa langkah tambahan:

    docker run --privileged -it --rm -v /var/run/docker.sock:/var/run/docker.sock -v /usr/local/bin/docker:/usr/local/bin/docker alpine sh
    
    docker run --net=host --ipc=host --uts=host --pid=host -it --security-opt=seccomp=unconfined --privileged --rm -v /:/host alpine /bin/sh
    chroot /host
    

    Sekarang Anda memiliki akses ke semua file VM yang menjalankan dockerd. Log berada di /var/log/docker.log.

Izin pengguna baru mungkin tidak segera berlaku setelah memperbarui

Ketika Anda memberikan izin baru (peran baru) kepada perwakilan layanan, perubahan mungkin tidak segera diterapkan. Ada dua kemungkinan alasannya:

  • Penundaan penetapan peran Microsoft Entra. Biasanya cepat, tetapi bisa memakan waktu beberapa menit karena penundaan perambatan.

  • Penundaan izin pada server token ACR dapat memakan waktu hingga 10 menit. Untuk mengatasinya, Anda dapat docker logout dan kemudian mengautentikasi lagi dengan pengguna yang sama setelah 1 menit:

    docker logout myregistry.azurecr.io
    docker login myregistry.azurecr.io
    

Saat ini ACR tidak mendukung penghapusan replikasi beranda oleh pengguna. Solusinya adalah menyertakan replikasi beranda yang dibuat dalam templat tetapi lewati pembuatannya dengan menambahkan "condition": false seperti yang ditunjukkan di bawah ini:

{
    "name": "[concat(parameters('acrName'), '/', parameters('location'))]",
    "condition": false,
    "type": "Microsoft.ContainerRegistry/registries/replications",
    "apiVersion": "2017-10-01",
    "location": "[parameters('location')]",
    "properties": {},
    "dependsOn": [
        "[concat('Microsoft.ContainerRegistry/registries/', parameters('acrName'))]"
     ]
},

Informasi autentikasi tidak diberikan dalam format yang benar pada panggilan REST API langsung

Anda mungkin mengalami kesalahan InvalidAuthenticationInfo, terutama menggunakan alat curl dengan opsi -L, --location (untuk mengikuti pengalihan). Misalnya, mengambil blob menggunakan curl dengan opsi -L dan autentikasi dasar:

curl -L -H "Authorization: basic $credential" https://$registry.azurecr.io/v2/$repository/blobs/$digest

dapat mengakibatkan respons berikut:

<?xml version="1.0" encoding="utf-8"?>
<Error><Code>InvalidAuthenticationInfo</Code><Message>Authentication information is not given in the correct format. Check the value of Authorization header.
RequestId:00000000-0000-0000-0000-000000000000
Time:2019-01-01T00:00:00.0000000Z</Message></Error>

Akar penyebabnya adalah bahwa beberapa implementasi curl mengikuti pengalihan dengan header dari permintaan asli.

Untuk menyelesaikan masalah tersebut, Anda perlu mengikuti pengalihan secara manual tanpa header. Cetak header respons dengan opsi -D - dari curl dan kemudian ekstrak: header Location:

REDIRECT_URL=$(curl -s -D - -H "Authorization: basic $credential" https://$registry.azurecr.io/v2/$repository/blobs/$digest | grep "^Location: " | cut -d " " -f2 | tr -d '\r')
curl $REDIRECT_URL

Mengapa portal Microsoft Azure tidak mencantumkan semua repositori atau tag saya?

Jika Anda menggunakan browser Microsoft Edge/IE, Anda dapat melihat paling banyak 100 repositori atau tag. Jika registri Anda memiliki lebih dari 100 repositori atau tag, sebaiknya gunakan browser Firefox atau Chrome untuk mencantumkan semuanya.

Mengapa portal Microsoft Azure gagal mengambil repositori atau tag?

Browser mungkin tidak dapat mengirim permintaan untuk mengambil repositori atau tag ke server. Mungkin ada berbagai alasan seperti:

  • Konektivitas jaringan
  • Firewall
  • Menggunakan portal dari jaringan publik untuk registri yang hanya mengizinkan akses pribadi
  • Pemblokir iklan
  • Kesalahan DNS

Silakan hubungi administrator jaringan Anda atau periksa konfigurasi dan konektivitas jaringan Anda. Coba jalankan az acr check-health -n yourRegistry menggunakan Azure CLI Anda untuk memeriksa apakah lingkungan Anda dapat terhubung ke Container Registry. Selain itu, Anda juga dapat mencoba sesi incognito atau pribadi di browser Anda untuk menghindari cache atau cookie browser kedaluwarsa.

Mengapa permintaan tarik atau dorong saya gagal dengan operasi yang tidak diizinkan?

Berikut adalah beberapa skenario di mana operasi mungkin tidak diizinkan:

  • Registri klasik tidak lagi didukung. Silakan mutakhirkan ke tingkat layanan yang didukung menggunakan az acr update atau portal Microsoft Azure.
  • Gambar atau repositori mungkin terkunci sehingga tidak dapat dihapus atau diperbarui. Anda dapat menggunakan perintah az acr repository show untuk melihat atribut saat ini.
  • Beberapa operasi dilarang jika gambar berada di karantina. Pelajari lebih lanjut tentang karantina.
  • Registri Anda mungkin telah mencapai batas penyimpanannya.

Format repositori tidak valid atau tidak didukung

Jika Anda melihat kesalahan seperti "format repositori yang tidak didukung", "format tidak valid", atau "data yang diminta tidak ada" saat menentukan nama repositori dalam operasi repositori, periksa ejaan dan huruf besar atau kecil dari nama. Nama repositori yang valid hanya dapat menyertakan karakter alfanumerik huruf kecil, titik, tanda hubung, garis bawah, dan garis miring.

Bagaimana cara mengumpulkan jejak http di Windows?

Prasyarat

Kontainer Windows

Mengonfigurasi proksi Docker ke 127.0.0.1:8888

Kontainer Linux

Temukan ip dari sakelar virtual vm Docker:

(Get-NetIPAddress -InterfaceAlias "*Docker*" -AddressFamily IPv4).IPAddress

Mengonfigurasi proksi Docker ke output perintah sebelumnya dan port 8888 (misalnya 10.0.75.1:8888)

Tugas

Bagaimana cara membatalkan batch operasi?

Perintah berikut membatalkan semua tugas yang sedang berjalan di registri yang ditentukan.

az acr task list-runs -r $myregistry --run-status Running --query '[].runId' -o tsv \
| xargs -I% az acr task cancel-run -r $myregistry --run-id %

Bagaimana cara menyertakan folder .git dalam perintah az acr build?

Jika Anda meneruskan folder sumber lokal ke perintah az acr build, folder .git dikecualikan dari paket yang diunggah secara default. Anda bisa membuat file .dockerignore dengan pengaturan berikut. Ini memberi tahu perintah untuk memulihkan semua file di bawah .git dalam paket yang diunggah.

!.git/**

Pengaturan ini juga berlaku untuk perintah az acr run.

Apakah Tugas mendukung GitLab untuk pemicu Sumber?

Saat ini kami tidak mendukung GitLab untuk pemicu Sumber.

Layanan manajemen repositori git apa yang didukung Tugas?

Layanan Git Konteks sumber Build manual Buat otomatis melalui pemicu commit
GitHub https://github.com/user/myapp-repo.git#mybranch:myfolder Ya Ya
Azure Repos https://dev.azure.com/user/myproject/_git/myapp-repo#mybranch:myfolder Ya Ya
GitLab https://gitlab.com/user/myapp-repo.git#mybranch:myfolder Ya Tidak
BitBucket https://user@bitbucket.org/user/mayapp-repo.git#mybranch:myfolder Ya Tidak

Jalankan Pemecahan Masalah Pesan Kesalahan

Pesan kesalahan Panduan pemecahan masalah
Tidak ada akses yang dikonfigurasi untuk VM, karenanya tidak ada langganan yang ditemukan Ini bisa terjadi jika Anda menggunakan az login --identity dalam Tugas ACR Anda. Ini adalah kesalahan sementara dan terjadi ketika penetapan peran Identitas Terkelola Anda belum disebarluaskan. Menunggu beberapa detik sebelum mencoba kembali bekerja.

Integrasi CI/CD

Bagaimana cara mengatasi apakah pembuatan kumpulan Agen gagal karena masalah waktu habis?

Siapkan aturan firewall yang benar ke kelompok keamanan jaringan yang ada atau rute yang ditentukan pengguna. Setelah penyiapan, tunggu beberapa menit hingga aturan firewall diterapkan.

Bagaimana cara pengaktifan kebijakan bawaan Azure untuk blok ACR memungkinkan kredensial admin?

Kebijakan bawaan Azure berikut, saat diatur ke status kebijakan masing-masing, akan memblokir pengguna agar tidak mengaktifkan pengguna admin di registri mereka.

Kebijakan bawaan Azure Status kebijakan Status admin
Konfigurasikan registri kontainer untuk menonaktifkan akun admin lokal. Mengubah Nonaktifkan
Registri kontainer harus menonaktifkan akun admin lokal. Tolak Nonaktifkan
Registri kontainer harus menonaktifkan akun admin lokal. Audit tidak patuh

Langkah berikutnya