Menghapus gambar kontainer pada Azure Container Registry

Untuk mempertahankan ukuran registri wadah Azure, Anda harus menghapus data citra usang secara berkala. Sementara beberapa citra kontainer yang diterapkan ke dalam produksi mungkin memerlukan penyimpanan jangka panjang, yang lain biasanya dapat dihapus lebih cepat. Misalnya, dalam skenario pembuatan dan pengujian otomatis, registri Anda dapat dengan cepat terisi dengan citra yang mungkin tidak pernah diterapkan, dan dapat dihapus segera setelah menyelesaikan pembuatan dan uji lulus.

Karena Anda dapat menghapus data citra dengan beberapa cara berbeda, penting untuk memahami bagaimana setiap pengoperasian penghapusan memengaruhi penggunaan penyimpanan. Artikel ini membahas beberapa metode untuk menghapus data citra:

  • Hapus repositori: Menghapus semua citra dan semua lapisan unik di dalam repositori.
  • Hapus menurut tag: Menghapus citra, tag, semua lapisan unik yang dirujuk oleh citra, dan semua tag lain yang terkait dengan citra.
  • Hapus dengan manifes intisari: Menghapus citra, semua lapisan unik yang dirujuk oleh citra, dan semua tag yang terkait dengan citra.

Untuk pengenalan konsep ini, lihat Tentang registri, repositori, dan citra.

Catatan

Setelah Anda menghapus data gambar, Azure Container Registry akan segera menghentikan penagihan untuk penyimpanan terkait. Namun, registri memulihkan ruang penyimpanan terkait menggunakan proses asinkron. Dibutuhkan beberapa waktu sebelum registri membersihkan lapisan dan menunjukkan penggunaan penyimpanan yang diperbarui.

Hapus repositori

Menghapus repositori akan menghapus semua citra dalam repositori, termasuk semua tag, lapisan unik, dan manifes. Saat Anda menghapus repositori, Anda memulihkan ruang penyimpanan yang digunakan oleh citra yang mereferensikan lapisan unik di repositori itu.

Perintah Azure CLI berikut menghapus repositori "acr-helloworld" dan semua tag dan manifes dalam repositori. Jika lapisan yang direferensikan oleh manifes yang dihapus tidak direferensikan oleh citra lain di registri, data lapisannya juga dihapus, memulihkan ruang penyimpanan.

 az acr repository delete --name myregistry --repository acr-helloworld

Hapus berdasarkan tag

Anda dapat menghapus masing-masing citra dari repositori dengan menentukan nama dan tag repositori dalam pengoperasian penghapusan. Saat Anda menghapus menurut tag, Anda memulihkan ruang penyimpanan yang digunakan oleh setiap lapisan unik dalam citra (lapisan yang tidak dibagikan oleh citra lain di registri).

Untuk menghapus menurut tag, gunakan az acr repository delete dan tentukan nama citra di parameter --image. Semua lapisan unik untuk citra, dan semua tag lain yang terkait dengan citra akan dihapus.

Misalnya, menghapus citra "acr-helloworld:latest" dari registri "myregistry":

az acr repository delete --name myregistry --image acr-helloworld:latest
This operation will delete the manifest 'sha256:0a2e01852872580b2c2fea9380ff8d7b637d3928783c55beb3f21a6e58d5d108' and all the following images: 'acr-helloworld:latest', 'acr-helloworld:v3'.
Are you sure you want to continue? (y/n):

Tip

Menghapus menurut tag tidak boleh disamakan dengan menghapus tag (membatalkan penandaan). Anda dapat menghapus tag dengan perintah Azure CLI az acr repository untag. Tidak ada ruang yang dikosongkan saat Anda menghapus tag pada citra karena manifes dan data lapisannya tetap ada di registri. Hanya referensi tag itu sendiri yang dihapus.

Hapus dengan ringkasan manifes

hash manifes dapat dikaitkan dengan satu, tidak ada, atau beberapa tag. Saat Anda menghapus dengan hash, semua tag yang direferensikan oleh manifes akan dihapus, seperti halnya data lapisan untuk setiap lapisan yang unik untuk citra. Data lapisan bersama tidak dihapus.

Untuk menghapus dengan hash, pertama-tama buat daftar hash manifes untuk repositori yang berisi citra yang ingin Anda hapus. Contohnya:

az acr manifest list-metadata --name acr-helloworld --registry myregistry
[
  {
    "digest": "sha256:0a2e01852872580b2c2fea9380ff8d7b637d3928783c55beb3f21a6e58d5d108",
    "tags": [
      "latest",
      "v3"
    ],
    "timestamp": "2018-07-12T15:52:00.2075864Z"
  },
  {
    "digest": "sha256:3168a21b98836dda7eb7a846b3d735286e09a32b0aa2401773da518e7eba3b57",
    "tags": [
      "v2"
    ],
    "timestamp": "2018-07-12T15:50:53.5372468Z"
  }
]

Selanjutnya, tentukan hash yang ingin Anda hapus dalam perintah az acr repository delete. Format perintahnya adalah:

az acr repository delete --name <acrName> --image <repositoryName>@<digest>

Misalnya, untuk menghapus manifes terakhir yang tercantum dalam output sebelumnya (dengan tag "v2"):

az acr repository delete --name myregistry --image acr-helloworld@sha256:3168a21b98836dda7eb7a846b3d735286e09a32b0aa2401773da518e7eba3b57
This operation will delete the manifest 'sha256:3168a21b98836dda7eb7a846b3d735286e09a32b0aa2401773da518e7eba3b57' and all the following images: 'acr-helloworld:v2'.
Are you sure you want to continue? (y/n): 

Citra acr-helloworld:v2 dihapus dari registri, seperti halnya data lapisan apa pun yang unik untuk citra tersebut. Jika manifes dikaitkan dengan beberapa tag, semua tag terkait juga akan dihapus.

Hapus hash berdasarkan tanda waktu

Untuk mempertahankan ukuran repositori atau registri, Anda mungkin perlu menghapus ringkasan manifes yang lebih lama dari tanggal tertentu secara berkala.

Perintah Azure CLI berikut mencantumkan daftar semua hash manifes dalam repositori yang lebih lama dari tanda waktu yang ditentukan, dalam urutan menaik. Ganti <acrName> dan <repositoryName> dengan nilai yang sesuai untuk lingkungan Anda. Tanda waktu dapat berupa ekspresi tanggal-waktu penuh atau tanggal, seperti dalam contoh ini.

az acr manifest list-metadata --name <repositoryName> --registry <acrName> \
    --orderby time_asc -o tsv --query "[?lastUpdateTime < '2019-04-05'].[digest, lastUpdateTime]"

Setelah mengidentifikasi hash manifes yang kedaluwarsa, Anda dapat menjalankan skrip Bash berikut untuk menghapus hash manifes yang lebih lama dari tanda waktu yang ditentukan. Hal ini memerlukan Azure CLI dan xargs. Secara default, skrip tidak melakukan penghapusan. Ubah nilai ENABLE_DELETE menjadi true untuk mengaktifkan penghapusan citra.

Peringatan

Gunakan contoh skrip berikut dengan hati-hati--data citra yang dihapus TIDAK DAPAT DIKEMBALIKAN. Jika Anda memiliki sistem yang menarik citra dengan ringkasan manifes (sebagai lawan dari nama citra), Anda tidak boleh menjalankan skrip ini. Menghapus hash manifes akan mencegah sistem tersebut menarik citra dari registri Anda. Alih-alih menarik berdasarkan manifes, pertimbangkan untuk mengadopsi skema pemberian tag yang unik, praktik terbaik yang disarankan.

#!/bin/bash

# WARNING! This script deletes data!
# Run only if you do not have systems
# that pull images via manifest digest.

# Change to 'true' to enable image delete
ENABLE_DELETE=false

# Modify for your environment
# TIMESTAMP can be a date-time string such as 2019-03-15T17:55:00.
REGISTRY=myregistry
REPOSITORY=myrepository
TIMESTAMP=2019-04-05  

# Delete all images older than specified timestamp.

if [ "$ENABLE_DELETE" = true ]
then
    az acr manifest list-metadata --name $REPOSITORY --registry $REGISTRY \
    --orderby time_asc --query "[?lastUpdateTime < '$TIMESTAMP'].digest" -o tsv \
    | xargs -I% az acr repository delete --name $REGISTRY --image $REPOSITORY@% --yes
else
    echo "No data deleted."
    echo "Set ENABLE_DELETE=true to enable deletion of these images in $REPOSITORY:"
    az acr manifest list-metadata --name $REPOSITORY --registry $REGISTRY \
   --orderby time_asc --query "[?lastUpdateTime < '$TIMESTAMP'].[digest, lastUpdateTime]" -o tsv
fi

Hapus citra yang tidak ditandai

Seperti disebutkan di bagian Hash manifes, mendorong citra yang dimodifikasi menggunakan tag yang ada membatalkan tag citra yang didorong sebelumnya, menghasilkan citra yang tidak ada (atau "menggantung"). Manifes citra yang didorong sebelumnya--dan data lapisannya--tetap berada di registri. Perhatikan urutan acara berikut ini:

  1. Dorong citra acr-helloworld dengan tag terbaru: docker push myregistry.azurecr.io/acr-helloworld:latest

  2. Periksa manifes untuk repositori acr-helloworld:

    az acr manifest list-metadata --name acr-helloworld --registry myregistry
    
    
    [
      {
        "digest": "sha256:d2bdc0c22d78cde155f53b4092111d7e13fe28ebf87a945f94b19c248000ceec",
        "tags": [
          "latest"
        ],
        "timestamp": "2018-07-11T21:32:21.1400513Z"
      }
    ]
    
  3. Modifikasi acr-helloworld Dockerfile

  4. Dorong citra acr-helloworld dengan tag terbaru: docker push myregistry.azurecr.io/acr-helloworld:latest

  5. Periksa manifes untuk repositori acr-helloworld:

    az acr manifest list-metadata --name acr-helloworld --registry myregistry
    
    [
      {
     "architecture": "amd64",
     "changeableAttributes": {
       "deleteEnabled": true,
       "listEnabled": true,
       "quarantineDetails": "{\"state\":\"Scan Passed\",\"link\":\"https://aka.ms/test\",\"scanner\":\"Azure Security Monitoring-Qualys Scanner\",\"result\":{\"version\":\"2020-05-13T00:23:31.954Z\",\"summary\":[{\"severity\":\"High\",\"count\":2},{\"severity\":\"Medium\",\"count\":0},{\"severity\":\"Low\",\"count\":0}]}}",
       "quarantineState": "Passed",
       "readEnabled": true,
       "writeEnabled": true
     },
     "configMediaType": "application/vnd.docker.container.image.v1+json",
     "createdTime": "2020-05-16T04:25:14.3112885Z",
     "digest": "sha256:eef2ef471f9f9d01fd2ed81bd2492ddcbc0f281b0a6e4edb700fbf9025448388",
     "imageSize": 22906605,
     "lastUpdateTime": "2020-05-16T04:25:14.3112885Z",
     "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
     "os": "linux",
     "timestamp": "2020-05-16T04:25:14.3112885Z"
      }
    ]
    

Array tag dihapus dari meta-data saat gambar tidak diberi tag. Manifes ini masih ada di dalam registri, bersama dengan data lapisan unik apa pun yang dirujuknya. Untuk menghapus citra yatim piatu dan data lapisannya, Anda harus menghapus dengan hash manifes.

Menghapus tag dan manifes secara otomatis

Azure Container Registry menyediakan metode otomatis berikut untuk menghapus tag dan manifes, dan data lapisan unik terkait:

  • Buat tugas ACR yang menjalankan perintah kontainer acr purge untuk menghapus semua tag yang lebih lama dari durasi tertentu atau cocok dengan filter nama yang ditentukan. Anda juga secara opsional dapat mengonfigurasi acr purge untuk menghapus manifes yang tidak di-tag.

    Perintah kontainer acr purge saat ini dalam pratinjau. Untuk informasi selengkapnya, lihat Menghapus citra secara otomatis dari registri kontainer Azure.

  • Secara opsional, tetapkan kebijakan retensi untuk setiap registri, untuk mengelola manifes yang tidak diberi tag. Saat Anda mengaktifkan kebijakan penyimpanan, citra yang dimanifestasikan di registri yang tidak memiliki tag terkait, dan data lapisan yang mendasari, secara otomatis dihapus setelah jangka waktu yang ditetapkan.

    Kebijakan penyimpanan saat ini merupakan fitur pratinjau registri kontainer Premium. Kebijakan penyimpanan hanya berlaku untuk manifes yang tidak di-tag yang dibuat setelah kebijakan berlaku.

Langkah berikutnya

Untuk informasi selengkapnya tentang penyimpanan gambar di Azure Container Registry, lihat Penyimpanan gambar Kontainer di Azure Container Registry.