Odstranění imagí kontejneru ve službě Azure Container Registry

Pokud chcete zachovat velikost registru kontejneru Azure, měli byste pravidelně odstraňovat zastaralá data imagí. Zatímco některé image kontejnerů nasazené do produkčního prostředí můžou vyžadovat dlouhodobější úložiště, jiné se obvykle dají odstranit rychleji. Například ve scénáři automatizovaného sestavení a testování se váš registr může rychle zaplnit imagemi, které se nikdy nenasadí, a krátce po dokončení sestavení a testu se dají vymazat.

Vzhledem k tomu, že data obrázků můžete odstranit několika různými způsoby, je důležité pochopit, jak každá operace odstranění ovlivňuje využití úložiště. Tento článek popisuje několik metod pro odstranění dat obrázku:

  • Odstranění úložiště: Odstraní všechny obrázky a všechny jedinečné vrstvy v úložišti.
  • Odstranit podle značky: Odstraní obrázek, značku, všechny jedinečné vrstvy, na které obrázek odkazuje, a všechny ostatní značky přidružené k obrázku.
  • Odstranit pomocí souhrnu manifestu: Odstraní obrázek, všechny jedinečné vrstvy, na které obrázek odkazuje, a všechny značky přidružené k obrázku.

Úvod k těmto konceptům najdete v tématu Informace o registrech, úložištích a imagích.

Poznámka

Po odstranění dat obrázků vám Azure Container Registry okamžitě zastaví fakturaci přidruženého úložiště. Registr však obnoví přidružený prostor úložiště pomocí asynchronního procesu. Nějakou dobu trvá, než registr vyčistí vrstvy a zobrazí aktualizované využití úložiště.

Odstranění úložiště

Odstraněním úložiště se odstraní všechny image v úložišti, včetně všech značek, jedinečných vrstev a manifestů. Když odstraníte úložiště, obnovíte prostor úložiště používaný obrázky, které odkazují na jedinečné vrstvy v daném úložišti.

Následující příkaz Azure CLI odstraní úložiště acr-helloworld a všechny značky a manifesty v úložišti. Pokud na vrstvy odkazované odstraněnými manifesty neodkazují žádné jiné image v registru, odstraní se také jejich data a obnoví se prostor úložiště.

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

Odstranit podle značky

Jednotlivé image z úložiště můžete odstranit zadáním názvu a značky úložiště v operaci odstranění. Když odstraníte pomocí značky, obnovíte prostor úložiště, který využívají všechny jedinečné vrstvy v imagi (vrstvy, které nesdílejí žádné jiné image v registru).

Pokud chcete odstranit pomocí značky, použijte az acr repository delete a v parametru --image zadejte název image. Všechny vrstvy jedinečné pro obrázek a všechny ostatní značky přidružené k obrázku se odstraní.

Například odstranění image "acr-helloworld:latest" z registru "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

Odstranění podle značky by nemělo být zaměňováno s odstraněním značky (zrušení značky). Značku můžete odstranit pomocí příkazu Azure CLI az acr repository untag. Při zrušení značky image se neuvolní žádné místo, protože data manifestu a vrstvy zůstanou v registru. Odstraní se jenom samotný odkaz na značku.

Odstranit pomocí souhrnu manifestu

Souhrn manifestu může být přidružený k jedné, žádné nebo více značek. Když odstraníte pomocí hodnot hash, odstraní se všechny značky, na které manifest odkazuje, stejně jako data vrstev pro všechny vrstvy jedinečné pro obrázek. Sdílená data vrstvy se neodstraní.

Pokud chcete odstranit pomocí hodnot hash, nejprve vypište souhrny manifestu pro úložiště obsahující obrázky, které chcete odstranit. Příklad:

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

Dále v příkazu az acr repository delete zadejte hodnotu hash, kterou chcete odstranit. Příkaz má tento formát:

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

Pokud chcete například odstranit poslední manifest uvedený v předchozím výstupu (se značkou "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): 

Image se acr-helloworld:v2 odstraní z registru, stejně jako všechna data vrstvy jedinečná pro danou image. Pokud je manifest spojený s více značkami, odstraní se také všechny přidružené značky.

Odstranění hodnot hash podle časového razítka

Pokud chcete zachovat velikost úložiště nebo registru, možná budete muset pravidelně odstraňovat hodnoty hash manifestu starší než určité datum.

Následující příkaz Azure CLI obsahuje seznam všech hodnot hash manifestu v úložišti starším než zadané časové razítko ve vzestupném pořadí. Nahraďte <acrName> a <repositoryName> hodnotami vhodnými pro vaše prostředí. Časové razítko může být úplný výraz data a času nebo datum, jako v tomto příkladu.

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

Po identifikaci zastaralých hodnot hash manifestu můžete spuštěním následujícího skriptu Bash odstranit souhrny manifestu starší než zadané časové razítko. Vyžaduje Azure CLI a xargs. Ve výchozím nastavení skript neprovádí žádné odstranění. Změňte hodnotu na ENABLE_DELETEtrue , aby bylo možné odstranit image.

Upozornění

Použijte následující ukázkový skript s opatrností – odstraněná data obrázku nejsou obnovitelná. Pokud máte systémy, které načítá image pomocí funkce manifest digest (na rozdíl od názvu image), neměli byste tyto skripty spouštět. Odstraněním hodnot hash manifestu zabráníte těmto systémům v načítání imagí z vašeho registru. Místo stahování podle manifestu zvažte přijetí jedinečného schématu označování, které je doporučeným osvědčeným postupem.

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

Odstranění neznačkovaných imagí

Jak je uvedeno v části Souhrn manifestu , odesláním upraveného obrázku pomocí existující značky zrušíte značky dříve nasdílené image, což vede k osamocenému (neboli "visícímu") obrázku. Manifest dříve nasdílené image a data její vrstvy zůstanou v registru. Vezměte v úvahu následující posloupnost událostí:

  1. Nasdílejte image acr-helloworld se značkou latest: docker push myregistry.azurecr.io/acr-helloworld:latest

  2. Zkontrolujte manifesty pro úložiště 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. Úprava souboru Dockerfile acr-helloworld

  4. Nasdílejte image acr-helloworld se značkou latest: docker push myregistry.azurecr.io/acr-helloworld:latest

  5. Zkontrolujte manifesty pro úložiště 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"
      }
    ]
    

Pole značek se odebere z metadat, když je obrázek bez značky. Tento manifest stále existuje v rámci registru spolu se všemi jedinečnými daty vrstvy, na která odkazuje. Pokud chcete odstranit tyto osamocené obrázky a data jejich vrstev, musíte je odstranit pomocí příkazu manifest digest.

Automatické vymazání značek a manifestů

Azure Container Registry poskytuje následující automatizované metody pro odebrání značek a manifestů a jejich přidružených jedinečných dat vrstvy:

  • Vytvořte úlohu ACR, která spustí příkaz kontejneru acr purge , který odstraní všechny značky, které jsou starší než určitou dobu trvání nebo odpovídají zadanému filtru názvů. Volitelně můžete nakonfigurovat acr purge , aby se odstranily neznačené manifesty.

    Příkaz acr purge kontejneru je aktuálně ve verzi Preview. Další informace najdete v tématu Automatické vymazání imagí z registru kontejneru Azure.

  • Volitelně můžete nastavit zásadu uchovávání informací pro každý registr, aby bylo možné spravovat nezoznačené manifesty. Když povolíte zásady uchovávání informací, manifesty imagí v registru, které nemají žádné přidružené značky, a podkladová data vrstvy se po uplynutí nastaveného období automaticky odstraní.

    Zásady uchovávání informací jsou v současné době funkcí ve verzi Preview registrů kontejnerů Premium . Zásady uchovávání informací se vztahují pouze na manifesty bez oznamovaných dat vytvořené poté, co se zásada projeví.

Další kroky

Další informace o úložišti imagí v Azure Container Registry najdete v tématu Úložiště imagí kontejneru v Azure Container Registry.