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ć 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 zostaną wdrożone, i można go przeczyścić wkrótce po zakończeniu kompilacji i testu.

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.
  • 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 usługa Azure Container Registry przestanie naliczać opłaty natychmiast dla skojarzonego magazynu. Jednak rejestr odzyskuje skojarzone miejsce do magazynowania przy użyciu procesu asynchronicznego. Przed wyczyszczeniem warstw rejestru i wyświetlenie zaktualizowanego użycia 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. 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 interfejsu wiersza polecenia platformy Azure usuwa repozytorium "acr-helloworld" oraz wszystkie tagi i manifesty w repozytorium. Jeśli warstwy, do których odwołuje się usunięte manifesty, nie są przywoływane przez inne obrazy w rejestrze, ich dane warstw są również usuwane, odzyskując miejsce do magazynowania.

 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 do magazynowania używanego przez wszystkie unikatowe warstwy na obrazie (warstwy nieudostępniane 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 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ąć za pomocą polecenia interfejsu wiersza polecenia platformy Azure az acr repository untag. W przypadku untagowania obrazu nie zwalnia się miejsca, ponieważ jego dane manifestu i 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ąć. 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 interfejsu wiersza polecenia platformy Azure wyświetla listę wszystkich skrótów 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. 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 powłoki Bash, aby usunąć skróty manifestu starsze niż określony znacznik czasu. Wymaga interfejsu wiersza polecenia platformy Azure 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. 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 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. Wypychanie obrazu 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 oddzielone obrazy i ich dane warstwowe, musisz usunąć je za pomocą 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 aby usunąć wszystkie tagi starsze niż określony czas trwania lub dopasować określony filtr nazwy. Opcjonalnie skonfiguruj acr purge polecenie , aby usunąć nieotagowane manifesty.

    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 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 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.