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. Podczas gdy niektóre obrazy kontenerów wdrożone w środowisku produkcyjnym mogą wymagać długoterminowego przechowywania, inne mogą być zwykle usuwane szybciej. Na przykład w scenariuszu zautomatyzowanej kompilacji i testowania rejestr może szybko wypełnić obrazy, które nigdy nie zostały wdrożone, i można je przeczyścić wkrótce po ukończeniu testu i kompilacji.

Ponieważ można usunąć dane obrazu 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.
  • Usuń 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 Azure Container Registry zatrzymuje rozliczenia natychmiast dla skojarzonego magazynu. Jednak rejestr odzyskuje skojarzone miejsce do magazynowania przy użyciu procesu asynchronicznego. Zanim rejestr wyczyści warstwy i wyświetli zaktualizowane użycie magazynu, zajmuje trochę czasu.

Usuwanie repozytorium

Usunięcie repozytorium powoduje usunięcie wszystkich obrazów w repozytorium, w tym wszystkich tagów, unikatowych warstw i manifestów. Po usunięciu repozytorium odzyskasz miejsce do magazynowania używane przez obrazy odwołujące się do unikatowych warstw w tym repozytorium.

Następujące polecenie interfejsu wiersza polecenia platformy Azure usuwa repozytorium "acr-helloworld" oraz wszystkie tagi i manifesty w repozytorium. Jeśli warstwy przywoływane przez usunięte manifesty nie są przywoływane przez inne obrazy w rejestrze, ich dane warstwy również zostaną usunięte, odzyskanie miejsca do magazynowania.

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

Usuń według tagu

Poszczególne obrazy można usunąć z repozytorium, określając nazwę repozytorium i tag w operacji usuwania. Po usunięciu tagu można odzyskać miejsce do magazynowania używane przez wszystkie unikatowe warstwy na obrazie (warstwy nieudzielone przez żadne inne obrazy w rejestrze).

Aby usunąć według tagu, użyj polecenia az acr repository delete i określ nazwę obrazu w parametrze --image . Wszystkie warstwy unikatowe dla obrazu, a 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):

Porada

Usuwanie według tagu nie powinno być mylone z usuwaniem tagu (cofnij tag). Tag można usunąć za pomocą polecenia interfejsu wiersza polecenia platformy Azure az acr repository untag. Brak wolnego miejsca podczas wyrejeracji obrazu, ponieważ jego manifest i dane warstwy pozostają w rejestrze. Usunięto tylko odwołanie do tagu.

Usuwanie według 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ąć. 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 warstwy 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 interfejsu wiersza polecenia platformy Azure wyświetla wszystkie skróty manifestu w repozytorium starszym niż określony znacznik czasu w kolejności rosnącej. Zastąp <acrName> wartości i <repositoryName> odpowiednimi dla danego środowiska. Sygnatura czasowa może być pełnym wyrażeniem daty/godziny lub datą, 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 powłoki Bash, aby usunąć skróty manifestu starsze niż określony znacznik czasu. Wymaga interfejsu wiersza polecenia platformy Azure i biblioteki xargs. Domyślnie skrypt nie wykonuje usuwania. Zmień wartość , ENABLE_DELETE aby true włączyć usuwanie obrazu.

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 według 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ć przez manifest, rozważ wdrożenie unikatowego schematu tagowania , zalecane najlepsze rozwiązanie.

#!/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 nieoznakowanych 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. Wcześniej wypchnięty obraz manifestu i jego warstwy danych pozostaje w rejestrze. Rozważ następującą sekwencję zdarzeń:

  1. Wypychanie obrazu acr-helloworld z najnowszym tagiem: 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. Wypychanie obrazu acr-helloworld z najnowszym tagiem: 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 nieoznakowany. Ten manifest nadal istnieje w rejestrze wraz z wszelkimi unikatowymi danymi warstwy, do których się odwołuje. Aby usunąć takie oddzielone obrazy i ich dane warstwowe, należy usunąć je przez skrót manifestu.

Automatyczne przeczyszczanie tagów i manifestów

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, które uruchamia polecenie kontenera acr purge , aby usunąć wszystkie tagi starsze niż określony czas trwania lub dopasować określony filtr nazw. Opcjonalnie skonfiguruj acr purge opcję usuwania nieoznakowanych manifestów.

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

  • Opcjonalnie ustaw zasady przechowywania dla każdego rejestru, aby zarządzać 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.

    Zasady przechowywania są obecnie funkcją w wersji zapoznawczej rejestrów kontenerów w warstwie Premium . Zasady przechowywania dotyczą tylko nieoznakowanych manifestów utworzonych po wprowadzeniu zasad.

Następne kroki

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