احذف صور الحاوية في Azure Container Registry

للحفاظ على حجم سجل حاوية Azure، يجب حذف بيانات الصورة القديمة بشكل دوري. في حين أن بعض صور الحاويات التي تم نشرها في الإنتاج قد تتطلب تخزيناً طويل المدى، يمكن عادةً حذف صور أخرى بسرعة أكبر. على سبيل المثال، في سيناريو الإنشاء والاختبار الآلي، يمكن أن يملأ السجل بسرعة بالصور التي قد لا يتم نشرها مطلقاً، ويمكن إزالتها بعد وقت قصير من إكمال بناء واختبار اجتياز.

نظراً لأنه يمكنك حذف بيانات الصورة بعدة طرق مختلفة، فمن المهم فهم كيفية تأثير كل عملية حذف على استخدام التخزين. تتناول هذه المقالة عدة طرق لحذف بيانات الصورة:

  • حذف repository: يحذف كل الصور وكل الطبقات الفريدة داخل المستودع.
  • الحذف بواسطة tag: يحذف الصورة والعلامة وكل الطبقات الفريدة المشار إليها بواسطة الصورة وجميع العلامات الأخرى المرتبطة بالصورة.
  • حذف بواسطة manifest digest: يحذف صورة، وجميع الطبقات الفريدة المشار إليها بواسطة الصورة، وجميع العلامات المرتبطة بالصورة.

للحصول على مقدمة حول هذه المفاهيم، راجع حول السجلات والمستودعات والصور.

ملاحظة

بعد حذف بيانات الصورة، يتوقف Azure Container Registry عن تحرير الفواتير لك فوراً مقابل التخزين المرتبط. ومع ذلك، يستعيد السجل مساحة التخزين المرتبطة باستخدام عملية غير متزامنة. يستغرق التسجيل بعض الوقت قبل أن ينظف الطبقات ويظهر استخدام التخزين المحدث.

حذف المستودع

يؤدي حذف المستودع إلى حذف كل الصور الموجودة في المستودع، بما في ذلك كل العلامات والطبقات الفريدة والملفات. عندما تحذف مستودعاً، فإنك تستعيد مساحة التخزين المستخدمة بواسطة الصور التي تشير إلى طبقات فريدة في هذا المستودع.

يحذف أمر Azure CLI التالي مستودع "acr-helloworld" وجميع العلامات والبيان داخل المستودع. إذا لم تتم الإشارة إلى الطبقات المشار إليها بواسطة البيانات المحذوفة بواسطة أي صور أخرى في السجل، فسيتم أيضاً حذف بيانات الطبقة الخاصة بها، واستعادة مساحة التخزين.

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

حذف بالعلامة

يمكنك حذف الصور الفردية من المستودع عن طريق تحديد اسم المستودع وعلامة التمييز في عملية الحذف. عندما تقوم بحذف بواسطة علامة، فإنك تستعيد مساحة التخزين المستخدمة من قِبل أي طبقات فريدة في الصورة (الطبقات غير المشتركة مع أي صور أخرى في السجل).

للحذف بالعلامة، استخدم az acr repository delete وحدد اسم الصورة في المعلمة --image. كل الطبقات الفريدة للصورة، وأي علامات أخرى مرتبطة بالصورة يتم حذفها.

على سبيل المثال، حذف "acr-helloworld: latest" صورة من التسجيل "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):

تلميح

لا يجب الخلط بين الحذف by tag وحذف علامة (عدم الإشارة). يمكنك حذف علامة باستخدام الأمر Azure CLI المسمى az acr repository untag. لا يتم تحرير أي مساحة عند إلغاء تحديد صورة لأن manifest الخاص بها وبيانات الطبقة تظل في السجل. يتم حذف مرجع العلامة نفسه فقط.

حذف من خلال ملخص البيان

يمكن أن يقترن manifest digest بعلامة واحدة أو لا شيء أو بعلامات متعددة. عندما تحذف بواسطة الملخص، يتم حذف جميع العلامات المشار إليها في البيان، كما هو الحال بالنسبة لبيانات الطبقة لأي طبقات فريدة للصورة. لا يتم حذف بيانات الطبقة المشتركة.

للحذف عن طريق الملخص، قم أولاً بإدراج ملخصات البيان للمستودع الذي يحتوي على الصور التي ترغب في حذفها. على سبيل المثال:

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"
  }
]

بعد ذلك، حدد الملخص الذي تريد حذفه في الأمر az acr repository delete. تنسيق الأمر هو:

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

على سبيل المثال، لحذف البيان الأخير المدرج في الإخراج السابق (مع العلامة "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): 

يتم حذف الصورة acr-helloworld:v2 من السجل، مثلها مثل أي بيانات طبقة فريدة لتلك الصورة. إذا كان البيان مرتبطاً بعلامات متعددة، فسيتم حذف جميع العلامات المرتبطة أيضاً.

حذف الملخصات حسب الطابع الزمني

للحفاظ على حجم المستودع أو السجل، قد تحتاج إلى حذف ملخصات البيان الأقدم من تاريخ معين بشكل دوري.

يسرد أمر Azure CLI التالي جميع ملخصات البيان في مستودع أقدم من طابع زمني محدد، بترتيب تصاعدي. استبدل <acrName> and <repositoryName> بقيم مناسبة لبيئتك. يمكن أن يكون الطابع الزمني عبارة عن تعبير كامل للتاريخ والوقت أو تاريخ، كما في هذا المثال.

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

بعد تحديد ملخصات البيان التي لا معنى لها، يمكنك تشغيل نص Bash النصي التالي لحذف ملخصات البيان الأقدم من طابع زمني محدد. يتطلب Azure CLI وxargs. بشكل افتراضي، لا يقوم البرنامج النصي بإجراء حذف. تغيير ENABLE_DELETE value to true لتمكين حذف الصورة.

تحذير

استخدم نموذج البرنامج النصي التالي بحذر - بيانات الصورة المحذوفة غير قابلة للاسترداد. إذا كانت لديك أنظمة تسحب الصور من خلال ملخص واضح (على عكس اسم الصورة)، فلا يجب عليك تشغيل هذه البرامج النصية. سيؤدي حذف ملخصات البيان إلى منع تلك الأنظمة من سحب الصور من السجل الخاص بك. بدلاً من السحب حسب البيان، ضع في اعتبارك استخدام مخطط وضع علامات فريد، وهو أفضل ممارسة موصى بها.

#!/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

حذف الصور غير المميزة

كما هو مذكور في قسم Manifest digest، يؤدي دفع صورة معدلة باستخدام علامة حالية إلى untags الصورة المدفوعة مسبقاً، ما يؤدي إلى صورة معزولة (أو "متدلية"). يظل بيان الصورة التي تم دفعها مسبقاً - وبيانات الطبقة الخاصة بها - في السجل. ضع في اعتبارك التسلسل التالي للأحداث:

  1. دفع الصورة acr-helloworld بالعلامة الأحدث: docker push myregistry.azurecr.io/acr-helloworld:latest

  2. تحقق من بيانات المستودع 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. عدّل acr-helloworld Dockerfile

  4. دفع الصورة acr-helloworld بالعلامة الأحدث: docker push myregistry.azurecr.io/acr-helloworld:latest

  5. تحقق من بيانات المستودع 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"
      }
    ]
    

تتم إزالة صفيف العلامات من بيانات التعريف عندما تكون الصورة غير معلمة. لا يزال هذا البيان موجوداً داخل السجل، إلى جانب أي بيانات طبقة فريدة يشير إليها. لحذف مثل هذه الصور المعزولة وبيانات الطبقة الخاصة بها، يجب حذف ملخص البيان.

مسح العلامات والبيان تلقائياً

يوفر Azure Container Registry الطرق التلقائية التالية لإزالة العلامات والبيانات وبيانات الطبقة الفريدة المرتبطة بها:

  • أنشئ مهمة ACR التي تقوم بتشغيل أمر الحاوية acr purge لحذف جميع العلامات الأقدم من مدة معينة أو تطابق عامل تصفية الاسم المحدد. يمكنك بشكل اختياري تكوين acr purge لحذف البيانات غير المميزة.

    أمر الحاوية acr purge قيد المعاينة حالياً. لمزيد من المعلومات، راجع إزالة الصور تلقائياً من سجل حاوية Azure.

  • يمكنك بشكل اختياري تعيين retention policy لكل سجل لإدارة البيانات غير المميزة. عند تمكين نهج استبقاء، يتم تلقائياً حذف بيانات الصور في السجل التي لا تحتوي على أي علامات مرتبطة وبيانات الطبقة الأساسية بعد فترة محددة.

    تعد نهج الاحتفاظ حالياً ميزة معاينة لسجلات حاوية Premium. تنطبق نهج الاحتفاظ فقط على البيانات غير المميزة التي تم إنشاؤها بعد تفعيل النهج.

الخطوات التالية

لمزيد من المعلومات حول تخزين الصور في Azure Container Registry، راجع تخزين صورة الحاوية في Azure Container Registry.