Udostępnij za pośrednictwem


Usuwanie obrazów kontenerów w usłudze Azure Container Registry

Aby zachować rozmiar rejestru kontenerów platformy Azure, należy okresowo usuwać nieaktualne dane obrazu. Chociaż niektóre obrazy kontenerów wdrożone w środowisku produkcyjnym mogą wymagać przechowywania przez dłuższy czas, inne zwykle można usunąć szybciej. Na przykład, w scenariuszu zautomatyzowanej kompilacji i testowania, rejestr może szybko się zapełnić obrazami, które nigdy nie zostaną wdrożone, i można go oczyścić zaraz po zakończeniu procesu kompilacji i testowania.

Ponieważ dane obrazów można usunąć na kilka różnych sposobów, ważne jest, aby zrozumieć, jak każda operacja usuwania wpływa na użycie magazynu. W tym artykule opisano kilka metod usuwania danych obrazu:

  • Usuń repozytorium: usuwa wszystkie obrazy i wszystkie unikatowe warstwy w repozytorium.
  • Usuń według tagu: usuwa obraz, tag, wszystkie unikatowe warstwy, do których odwołuje się obraz, oraz wszystkie inne tagi skojarzone z obrazem.
  • Usuwanie według skrótu manifestu: usuwa obraz, wszystkie unikatowe warstwy, do których odwołuje się obraz, oraz wszystkie tagi skojarzone z obrazem.

Aby zapoznać się z wprowadzeniem do tych pojęć, zobacz Informacje o rejestrach, repozytoriach i obrazach.

Uwaga

Po usunięciu danych obrazu, usługa Azure Container Registry natychmiast przestaje naliczać opłaty za skojarzone miejsce magazynowe. Jednak rejestr odzyskuje skojarzone miejsce do magazynowania przy użyciu procesu asynchronicznego. Zajmuje trochę czasu, zanim rejestr wyczyści warstwy i pokaże zaktualizowane użycie magazynu.

Usuwanie repozytorium

Usunięcie repozytorium powoduje usunięcie wszystkich obrazów w repozytorium, w tym wszystkich tagów, unikatowych warstw i manifestów. Usunięcie repozytorium spowoduje odzyskanie miejsca do magazynowania używanego przez obrazy odwołujące się do unikatowych warstw w tym repozytorium.

Następujące polecenie Azure CLI usuwa repozytorium "acr-helloworld" oraz wszystkie tagi i manifesty tego repozytorium. Jeśli warstwy, do których odwołują się usunięte manifesty, nie są używane przez inne obrazy w rejestrze, ich dane są również usuwane, co pozwala odzyskać przestrzeń magazynową.

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

Usuwanie według tagu

Poszczególne obrazy można usunąć z repozytorium, określając nazwę repozytorium i tag w operacji usuwania. Usunięcie według tagu spowoduje odzyskanie miejsca zajmowanego przez unikalne warstwy obrazu (warstwy niewspólne z żadnymi innymi obrazami w rejestrze).

Aby usunąć obraz oznaczony tagiem, użyj az acr repository delete i określ nazwę obrazu w parametrze --image. Wszystkie warstwy unikatowe dla obrazu i wszystkie inne tagi skojarzone z obrazem zostaną usunięte.

Na przykład usunięcie obrazu "acr-helloworld:latest" z rejestru "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):

Napiwek

Usuwanie według tagu nie powinno być mylone z usuwaniem tagu (odłączanie). Tag można usunąć poleceniem Azure CLI az acr repository untag. W przypadku untagowania obrazu nie zwalnia się miejsca, ponieważ jego manifest i dane warstwy pozostają w rejestrze. Usunięto tylko odwołanie do tagu.

Usuń za pomocą skrótu manifestu

Skrót manifestu może być skojarzony z jednym, brakiem lub wieloma tagami. Po usunięciu przez skrót wszystkie tagi, do których odwołuje się manifest, są usuwane, podobnie jak dane warstw dla wszystkich warstw unikatowych dla obrazu. Dane warstwy udostępnionej nie są usuwane.

Aby usunąć według skrótu, najpierw wyświetl listę skrótów manifestu dla repozytorium zawierającego obrazy, które chcesz usunąć. Na przykład:

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

Następnie określ skrót, który chcesz usunąć w poleceniu az acr repository delete. Format polecenia jest następujący:

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

Aby na przykład usunąć ostatni manifest wymieniony w poprzednich danych wyjściowych (z tagiem "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): 

Obraz acr-helloworld:v2 jest usuwany z rejestru, podobnie jak wszystkie dane warstwowe unikatowe dla tego obrazu. Jeśli manifest jest skojarzony z wieloma tagami, wszystkie skojarzone tagi również zostaną usunięte.

Usuwanie skrótów według znacznika czasu

Aby zachować rozmiar repozytorium lub rejestru, może być konieczne okresowe usuwanie skrótów manifestu starszych niż określona data.

Następujące polecenie Azure CLI wyświetla listę wszystkich skrótów manifestu w repozytorium, które są starsze niż określony znacznik czasu, w kolejności rosnącej. Zamień <acrName> i <repositoryName> na wartości odpowiednie dla twojego środowiska. Znacznik czasu może być wyrażeniem pełnej daty/godziny lub datą, tak jak w tym przykładzie.

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

Po zidentyfikowaniu nieaktualnych skrótów manifestu można uruchomić następujący skrypt Bash, aby usunąć skróty manifestu, które są starsze od określonego znacznika czasu. Wymaga Azure CLI i xargs. Domyślnie skrypt nie wykonuje usuwania. Zmień wartość na ENABLE_DELETE , aby true włączyć usuwanie obrazów.

Ostrzeżenie

Użyj następującego przykładowego skryptu z danymi obrazów usuniętymi przestrogą jest NIE DO ODZYSKANIA. Jeśli masz systemy ściągające obrazy za pomocą skrótu manifestu (w przeciwieństwie do nazwy obrazu), nie należy uruchamiać tych skryptów. Usunięcie skrótów manifestu uniemożliwi tym systemom ściąganie obrazów z rejestru. Zamiast ściągać za pomocą manifestu, rozważ wdrożenie unikatowego schematu tagowania , zalecanego najlepszego rozwiązania.

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

Usuwanie nieotagowanych obrazów

Jak wspomniano w sekcji Skrót manifestu, wypychanie zmodyfikowanego obrazu przy użyciu istniejącego tagu untaguje wcześniej wypchnięty obraz, co powoduje oddzielone (lub "zwisające") obraz. Manifest wypchniętego wcześniej obrazu i dane jego warstw pozostają w rejestrze. Rozważ następującą sekwencję zdarzeń:

  1. Wyślij obraz acr-helloworld z tagiem latest: docker push myregistry.azurecr.io/acr-helloworld:latest

  2. Sprawdź manifesty dla repozytorium 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. Modyfikowanie pliku Dockerfile acr-helloworld

  4. Wypchnij obraz acr-helloworld z tagiem latest: docker push myregistry.azurecr.io/acr-helloworld:latest

  5. Sprawdź manifesty dla repozytorium 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"
      }
    ]
    

Tablica tagów jest usuwana z metadanych, gdy obraz jest nieotagowany. Ten manifest nadal istnieje w rejestrze wraz z wszelkimi unikatowymi danymi warstwowymi, do których się odwołuje. Aby usunąć takie osierocone obrazy i ich dane warstwowe, musisz usunąć je według skrótu manifestu.

Automatyczne przeczyszczanie tagów i manifestów

Usługa Azure Container Registry udostępnia następujące zautomatyzowane metody usuwania tagów i manifestów oraz skojarzonych z nimi unikatowych danych warstwy:

  • Utwórz zadanie usługi ACR uruchamiające polecenie kontenera acr purge w celu usunięcia wszystkich tagów starszych niż określony czas trwania lub dopasowujących określony filtr nazwy. Opcjonalnie skonfiguruj acr purge do usunięcia nieotagowanych manifestów.

    Polecenie kontenera acr purge jest obecnie dostępne w wersji zapoznawczej. Aby uzyskać więcej informacji, zobacz Automatyczne przeczyszczanie obrazów z rejestru kontenerów platformy Azure.

  • Opcjonalnie ustaw politykę przechowywania dla każdego rejestru, do zarządzania manifestami bez tagów. Po włączeniu zasad przechowywania manifesty obrazów w rejestrze, które nie mają żadnych skojarzonych tagów i danych warstwy bazowej, są automatycznie usuwane po określonym okresie.

    Polityka przechowywania jest obecnie funkcją w wersji zapoznawczej rejestrów kontenerów Premium. Zasady przechowywania dotyczą tylko manifestów bez tagów utworzonych po wprowadzeniu zasad.

Następne kroki

Aby uzyskać więcej informacji na temat magazynu obrazów w usłudze Azure Container Registry, zobacz Magazyn obrazów kontenerów w usłudze Azure Container Registry.