Advertencia: Antes de aplicar cualquier política o proceso de borrado de imágenes, es altamente recomendable que revises las políticas y procesos en modo “dry run” y revises los resultados.


Nos guste o no nos guste el almacenamiento no es infinito, el límite puede ser físico o económico y con la parte económica seguro que más de uno nos hemos llevado una sorpresa revisando la factura de nuestro cloud provider.

Uno de los elementos a los que no solemos prestar atención es al almacenamiento de nuestros container registries, pudiendo llegar a almacenar cientos o miles de imágenes generadas en nuestros procesos de CI y que pasados unos días normalmente ya no son necesarias. A continuación vamos a mostrar como podemos limpiar nuestro Amazon Elastic Container Registry (Amazon ECR) o Microsoft Container Registry (Azure ACR).

Amazon Elastic Container Registry (Amazon ECR)

Amazon nos permite configurar políticas de ciclo de vida (Lifecycle policies) para cada uno de nuestros repositorios pudiendo definir varias reglas.

Cada política puede ser configurada manualmente (opción NO recomendada) o crearla de manera programática. Mi recomendación es que la creéis dentro de un paso en vuestro proceso de CI, si en el futuro necesitáis realizar un cambio de una política o regla en varios repositorios será una tarea rápida, fácil e indolora.

La política se define a través de un JSON pudiendo definir varias reglas con diferentes filtros:

  • Fecha push
  • Numero de imágenes
  • Estado
  • Tag (expresión regular)
{
    "rules": [
        {
            "rulePriority": 1,
            "description": "Expire images older than 14 days",
            "selection": {
                "tagStatus": "untagged",
                "countType": "sinceImagePushed",
                "countUnit": "days",
                "countNumber": 14
            },
            "action": {
                "type": "expire"
            }
        }
    ]
}

Una vez tengáis la política definida (se puede validar desde la consola de AWS https://docs.aws.amazon.com/AmazonECR/latest/userguide/lpp_creation.html podéis configurarla a través del comando:
aws ecr put-lifecycle-policy --repository-name ${REPOSITORY} --lifecycle-policy-text file://ecr_lifecycle_policy.json

Azure Container Registry (Azure ACR)

En Azure no existen las políticas de ciclo de vida (Lifecycle policies) para eliminar imágenes. Para ello debemos hacer uso de Azure cli y el comando acr purge.

El comando acr purge acepta dos parámetros:

  • –filter: Definimos a través de una expresión regular que imágenes hay que eliminar
  • –ago: elimina las imágenes con una antigüedad mayor a la indicada (ej. –ago 1d, elimina las imágenes con una antiguedad mayor a 1d)

Para ejecutar el comando podemos utilizar ACR Tasks (tiene un coste por tiempo de ejecución), este servicio nos permite ejecutar tareas mantenimiento sobre nuestro ACR de manera puntual o programada.

Al igual que con Amazon, mi recomendación es que ejecutéis el borrado dentro de vuestro proceso CI.

PURGE_CMD="acr purge \
--filter "${REPOSITORY}:^mytag-" \
--filter "${REPOSITORY}:^myothertag-" \
--untagged \
--ago 15d"

az acr run \
--cmd "$PURGE_CMD" \
--registry "$REGISTRY" \
--timeout 300 \
/dev/null

Referencias

https://docs.aws.amazon.com/AmazonECR/latest/userguide/LifecyclePolicies.html https://docs.microsoft.com/azure/container-registry/container-registry-tasks-overview https://docs.microsoft.com/azure/container-registry/container-registry-auto-purge