Orquesta Agentes IA que desarrollan por ti
Verificando...
26-container-images-cleanup
Procedimiento: Container Images Cleanup
Despliegue
1 plugin(s)
Editor
Preview
Tareas
1
Info
Titulo
Limpia imágenes de contenedor antiguas o no utilizadas. Libera espacio en registries, aplica políticas de retención, y documenta versiones activas.
Descripcion
Contenido Markdown
9459 caracteres
Guardar
# Procedimiento: Container Images Cleanup ## Metadata - **ID**: PROC-26 - **Frecuencia**: Semanal - **Duraci├│n estimada**: 15-30 min - **Requiere**: Acceso al registry de contenedores - **Dependencias**: Ninguna - **Bloquea**: Ninguno - **Agentes**: devops-engineer --- ## Objetivo Limpiar im├ígenes Docker antiguas del registry: 1. Identificar im├ígenes no usadas (sin deploys activos) 2. Eliminar tags antiguos (mantener ├║ltimos N) 3. Liberar espacio en el registry 4. Mantener im├ígenes de releases importantes --- ## Detecci├│n de Stack ```yaml stack: containerRegistry: "gitlab" # gitlab | acr | ecr | dockerhub | harbor ``` --- ## Pol├¡ticas de Retenci├│n Sugeridas | Tipo de Tag | Retenci├│n | Ejemplo | |-------------|-----------|---------| | `latest` | Siempre mantener | `api:latest` | | Release tags | ├Ültimos 10 | `api:v1.2.3` | | Feature branches | 7 d├¡as | `api:feature-xyz` | | PR/MR builds | 3 d├¡as | `api:mr-123` | | Commit SHA | 7 d├¡as | `api:abc123` | --- ## Checklist Ejecutable ### 1. Identificar Registry y Credenciales - [ ] Registry: ___ - [ ] Credenciales configuradas --- ## Para GitLab Container Registry ### 2. Listar Repositorios e Im├ígenes ```bash # Variables GITLAB_TOKEN="${GITLAB_TOKEN}" PROJECT_ID="${GITLAB_PROJECT_ID}" GITLAB_URL="${GITLAB_URL:-https://gitlab.com}" # Listar repositorios de contenedores curl -s --header "PRIVATE-TOKEN: $GITLAB_TOKEN" \ "$GITLAB_URL/api/v4/projects/$PROJECT_ID/registry/repositories" | \ jq '.[] | {id, name, path, tags_count}' # Listar tags de un repositorio REPO_ID="xxx" curl -s --header "PRIVATE-TOKEN: $GITLAB_TOKEN" \ "$GITLAB_URL/api/v4/projects/$PROJECT_ID/registry/repositories/$REPO_ID/tags" | \ jq '.[] | {name, created_at, total_size}' ``` - [ ] Repositorios listados - [ ] Total de tags: ___ ### 3. Identificar Im├ígenes Antiguas ```bash # Tags m├ís antiguos de 30 d├¡as curl -s --header "PRIVATE-TOKEN: $GITLAB_TOKEN" \ "$GITLAB_URL/api/v4/projects/$PROJECT_ID/registry/repositories/$REPO_ID/tags" | \ jq --arg date "$(date -d '30 days ago' -Iseconds)" \ '.[] | select(.created_at < $date) | {name, created_at}' # Calcular espacio a liberar curl -s --header "PRIVATE-TOKEN: $GITLAB_TOKEN" \ "$GITLAB_URL/api/v4/projects/$PROJECT_ID/registry/repositories/$REPO_ID/tags" | \ jq --arg date "$(date -d '30 days ago' -Iseconds)" \ '[.[] | select(.created_at < $date) | .total_size] | add' ``` - [ ] Im├ígenes > 30 d├¡as identificadas - [ ] Espacio a liberar: ___ MB ### 4. Identificar Tags a Preservar ```bash # Tags que NO eliminar: # - latest # - Tags semver (v*.*.*) # - Tags en uso en producci├│n # Obtener tags en uso (comparar con docker-compose/k8s manifests) grep -ohE "image:.*:[^ ]+" docker-compose*.yml kubernetes/*.yml | sort -u ``` - [ ] Tags en uso identificados - [ ] Tags a preservar listados ### 5. Eliminar Tags Antiguos ```bash # Eliminar un tag espec├¡fico TAG_NAME="old-tag" curl -s --request DELETE --header "PRIVATE-TOKEN: $GITLAB_TOKEN" \ "$GITLAB_URL/api/v4/projects/$PROJECT_ID/registry/repositories/$REPO_ID/tags/$TAG_NAME" # Bulk delete con pol├¡tica # GitLab soporta cleanup policies nativas curl -s --request PUT --header "PRIVATE-TOKEN: $GITLAB_TOKEN" \ --header "Content-Type: application/json" \ --data '{ "container_expiration_policy_attributes": { "enabled": true, "cadence": "7d", "keep_n": 10, "older_than": "14d", "name_regex_delete": ".*", "name_regex_keep": "^v\\d+\\.\\d+\\.\\d+$|^latest$" } }' \ "$GITLAB_URL/api/v4/projects/$PROJECT_ID" ``` - [ ] Pol├¡tica de limpieza configurada - [ ] Tags eliminados manualmente (si necesario) --- ## Para Azure Container Registry (ACR) ### 2. Listar Repositorios e Im├ígenes ```bash # Variables REGISTRY_NAME="${ACR_NAME}" # Login az acr login --name $REGISTRY_NAME # Listar repositorios az acr repository list --name $REGISTRY_NAME -o table # Listar tags de un repositorio az acr repository show-tags --name $REGISTRY_NAME --repository api -o table # Mostrar manifests con fechas az acr repository show-manifests --name $REGISTRY_NAME --repository api \ --orderby time_desc -o table ``` ### 3. Identificar y Eliminar Im├ígenes Antiguas ```bash # Eliminar tags m├ís antiguos de 30 d├¡as, mantener ├║ltimos 10 az acr run --registry $REGISTRY_NAME --cmd "acr purge \ --filter 'api:.*' \ --ago 30d \ --keep 10 \ --untagged" /dev/null # Preview (dry-run) az acr run --registry $REGISTRY_NAME --cmd "acr purge \ --filter 'api:.*' \ --ago 30d \ --keep 10 \ --dry-run" /dev/null ``` ### 4. Configurar Pol├¡tica Autom├ítica ```bash # Crear tarea programada de limpieza az acr task create \ --registry $REGISTRY_NAME \ --name cleanup \ --cmd "acr purge --filter 'api:.*' --ago 30d --keep 10 --untagged" \ --schedule "0 0 * * *" \ --context /dev/null ``` - [ ] Pol├¡tica de purge configurada - [ ] Tarea programada creada --- ## Para Amazon ECR ### 2. Listar y Limpiar ```bash # Listar repositorios aws ecr describe-repositories # Listar im├ígenes aws ecr describe-images --repository-name api \ --query 'imageDetails[*].[imageTags,imagePushedAt]' --output table # Pol├¡tica de ciclo de vida cat > lifecycle-policy.json << 'EOF' { "rules": [ { "rulePriority": 1, "description": "Keep last 10 tagged images", "selection": { "tagStatus": "tagged", "tagPrefixList": ["v"], "countType": "imageCountMoreThan", "countNumber": 10 }, "action": { "type": "expire" } }, { "rulePriority": 2, "description": "Delete untagged images older than 7 days", "selection": { "tagStatus": "untagged", "countType": "sinceImagePushed", "countUnit": "days", "countNumber": 7 }, "action": { "type": "expire" } } ] } EOF aws ecr put-lifecycle-policy --repository-name api \ --lifecycle-policy-text file://lifecycle-policy.json ``` --- ## Para Docker Hub ### 2. Limpiar Im├ígenes ```bash # Docker Hub no tiene API directa para eliminar # Usar hub-tool o portal web # Con hub-tool hub-tool tag rm username/api:old-tag # Listar tags hub-tool tag ls username/api ``` --- ## Output Esperado ``` ====== PROC-26 COMPLETADO [TIMESTAMP] ====== Proyecto: [nombre] Registry: GitLab / ACR / ECR ESTADO ANTES: - Repositorios: X - Total de tags: Y - Espacio usado: Z GB LIMPIEZA: - Tags eliminados: X - Espacio liberado: Y MB - Manifests hu├®rfanos: Z TAGS PRESERVADOS: - latest: Ô£à - v1.5.0 (release actual): Ô£à - v1.4.x (├║ltimos 3 releases): Ô£à - ├Ültimos 10 commits: Ô£à ESTADO DESPU├ëS: - Total de tags: Y - Espacio usado: Z GB POL├ìTICA CONFIGURADA: - Retenci├│n: 10 tags - Antig├╝edad m├íxima: 30 d├¡as - Regex preservar: ^v\d+\.\d+\.\d+$|^latest$ PR├ôXIMA LIMPIEZA: - Autom├ítica: S├¡/No - Frecuencia: Semanal ``` --- ## Criterios de ├ëxito - [ ] Tags > 30 d├¡as eliminados - [ ] ├Ültimos 10 releases preservados - [ ] `latest` y tags en uso preservados - [ ] Pol├¡tica autom├ítica configurada --- ## Alertas y Escalaci├│n | Severidad | Condici├│n | Acci├│n | |-----------|-----------|--------| | WARNING | >100 tags en un repositorio | Ejecutar limpieza | | WARNING | >80% espacio usado en registry | Limpieza urgente | | INFO | Limpieza completada | Documentar espacio liberado | --- ## Automatizaci├│n En ejecuci├│n no-interactiva: 1. Listar im├ígenes y tags 2. Identificar candidatos seg├║n pol├¡tica 3. Preservar tags importantes 4. Eliminar tags antiguos 5. Reportar espacio liberado 6. Configurar pol├¡tica autom├ítica si no existe --- --- ## Output Estructurado (Nexus) Al finalizar, el agente DEBE generar un bloque JSON con el siguiente formato para que Nexus pueda procesarlo automaticamente: ```json { "result": "success", "summary": "Ejecucion de PROC-26 completada. [Descripcion breve de resultados]", "metrics": { "issues_found": 0, "issues_resolved": 0, "items_removed": 15, "space_freed_mb": 500, "custom": { "procedure_specific_metric": "value" } }, "backlog_items": [ { "title": "Titulo del item de seguimiento", "description": "Descripcion detallada si se requiere accion futura", "priority": "medium", "type": "improvement", "tags": ["proc-26"] } ], "next_steps": [ "Accion recomendada 1", "Accion recomendada 2" ], "warnings": [ "Advertencias encontradas durante la ejecucion" ] } ``` **Campos requeridos:** - `result`: `"success"` | `"partial"` | `"failed"` - `summary`: Resumen ejecutivo en 1-3 lineas **Metricas especificas de este procedure:** - images_scanned, images_unused, space_freed_gb **Criterios de resultado:** - `success`: Procedimiento completado sin errores criticos - `partial`: Completado con algunos problemas menores o items pendientes - `failed`: Error critico o no se pudo completar ## Historial de Ejecuciones | Fecha | Proyecto | Registry | Tags Antes | Eliminados | Espacio Liberado | |-------|----------|----------|------------|------------|------------------| | | | | | | |
H1
H2
H3
Bold
Italic
Code
Lista
Num
Task
Code Block
Link
Nexus Platform
Reconectando
Recuperando la conexion
Se ha interrumpido la conexion con el servidor. Estamos reconectando automaticamente.
Reconectando...
Manten esta pestana abierta, volvemos enseguida.
No hemos podido reconectar
El servidor puede estar reiniciandose o tu conexion a internet es inestable.
Reintentar
La sesion ha expirado
Recarga la pagina para iniciar una nueva sesion.
Recargar
Si no vuelve en 30 segundos, recarga la pagina.