Ejecuto un registro privado de acopladores y quiero eliminar todas las imágenes, excepto las latest
de un repositorio. No quiero eliminar todo el repositorio, solo algunas de las imágenes que contiene. Los documentos de la API no mencionan una forma de hacer esto, pero seguramente es posible.
docker
docker-registry
León
fuente
fuente
Respuestas:
Actualmente no puede usar la API de registro para esa tarea. Solo le permite eliminar un repositorio o una etiqueta específica.
En general, eliminar un repositorio significa que todas las etiquetas asociadas a este repositorio se eliminan.
Eliminar una etiqueta significa que se elimina la asociación entre una imagen y una etiqueta.
Ninguna de las anteriores eliminará una sola imagen. Se dejan en su disco.
Solución alterna
Para esta solución, debe tener sus imágenes acopladas almacenadas localmente.
Una solución alternativa para su solución sería eliminar todas las etiquetas menos las últimas y, por lo tanto, eliminar potencialmente la referencia a las imágenes asociadas. Luego puede ejecutar este script para eliminar todas las imágenes, a las que no hace referencia ninguna etiqueta o la ascendencia de cualquier imagen utilizada.
Terminología (imágenes y etiquetas)
Considere un gráfico de imagen como esta, donde las letras mayúsculas (
A
,B
, ...) representan identificadores de imagen cortos y<-
medios que una imagen se basa en otra imagen:Ahora agregamos etiquetas a la imagen:
Aquí, la etiqueta hace
<version1>
referencia a la imagenC
y la etiqueta hace<version2>
referencia a la imagenD
.Refinando tu pregunta
En tu pregunta dijiste que querías eliminar
. Ahora, esta terminología no es del todo correcta. Has mezclado imágenes y etiquetas. Mirando el gráfico, creo que estaría de acuerdo en que la etiqueta
<version2>
representa la última versión. De hecho, de acuerdo con esta pregunta , puede tener una etiqueta que represente la última versión:Como la
<latest>
etiqueta hace referencia a la imagen,D
le pregunto: ¿realmente desea eliminar todo menos la imagenD
? ¡Probablemente no!¿Qué sucede si eliminas una etiqueta?
Si elimina la etiqueta
<version1>
con la API REST de Docker, obtendrá esto:Recuerde: ¡ Docker nunca eliminará una imagen! Incluso si lo hizo, en este caso no puede eliminar una imagen, ya que la imagen
C
es parte de la ascendencia de la imagenD
que está etiquetada.Incluso si usa este script , no se eliminará ninguna imagen.
Cuando una imagen puede ser borrada
Bajo la condición de que pueda controlar cuándo alguien puede jalar o empujar a su registro (por ejemplo, deshabilitando la interfaz REST). Puede eliminar una imagen de un gráfico de imagen si ninguna otra imagen se basa en ella y ninguna etiqueta hace referencia a ella.
Tenga en cuenta que en el siguiente gráfico, la imagen
D
se no basada enC
sino enB
. Por lo tanto,D
no depende deC
. Si elimina la etiqueta<version1>
en este gráfico, la imagenC
no será utilizada por ninguna imagen y este script puede eliminarla.Después de la limpieza, su gráfico de imagen se ve así:
¿Es esto lo que quieres?
fuente
Me he enfrentado al mismo problema con mi registro y luego probé la solución que figura a continuación desde una página de blog. Funciona.
Paso 1: listado de catálogos
Puede enumerar sus catálogos llamando a esta url:
La respuesta tendrá el siguiente formato:
Paso 2: listado de etiquetas para el catálogo relacionado
Puede enumerar las etiquetas de su catálogo llamando a esta url:
La respuesta tendrá el siguiente formato:
}
Paso 3: enumere el valor de manifiesto para la etiqueta relacionada
Puede ejecutar este comando en el contenedor de registro docker:
La respuesta tendrá el siguiente formato:
Ejecute el comando que se muestra a continuación con el valor de manifiesto:
Paso 4: eliminar los manifiestos marcados
Ejecute este comando en su contenedor de registro de docker:
Aquí está mi config.yml
fuente
Deleteing blob: /docker/...
" pero no cambiaron el espacio en disco utilizado. Usando bin / Registry github.com/docker/distribution v2.4.1 .Docker-Content-Digest
parte debe estar en minúsculas (probada en el motor Docker v18.09.2) es decircurl -v --silent -H "Accept: application/vnd.docker.distribution.manifest.v2+json" -X GET http://localhost:5000/v2/<name>/manifests/<tag> 2>&1 | grep docker-content-digest | awk '{print ($3)}'
El
v2
registro actual ahora admite la eliminación a través deDELETE /v2/<name>/manifests/<reference>
Ver: https://github.com/docker/distribution/blob/master/docs/spec/api.md#deleting-an-image
Uso de trabajo: https://github.com/byrnedo/docker-reg-tool
Editar: el manifiesto
<reference>
anterior se puede recuperar de solicitar aGET /v2/<name>/manifests/<tag>
y comprobando el
Docker-Content-Digest
encabezado en la respuesta.Edición 2: puede que tenga que ejecutar su registro con el siguiente conjunto de entorno:
REGISTRY_STORAGE_DELETE_ENABLED="true"
Edit3: puede que tenga que ejecutar la recolección de basura para liberar este espacio en disco: https://docs.docker.com/registry/garbage-collection/
fuente
DELETE
.{"errors":[{"code":"UNSUPPORTED","message":"The operation is unsupported."}]}
Problema 1
Usted mencionó que era su registro de acoplador privado, por lo que probablemente deba verificar la API de registro en lugar del documento de la API de registro de Hub , que es el enlace que proporcionó.
Problema 2
La API de registro de Docker es un protocolo cliente / servidor, depende de la implementación del servidor si se eliminan las imágenes en el back-end. (Supongo)
Explicación detallada
A continuación, demuestro cómo funciona ahora desde su descripción como entiendo sus preguntas.
Ejecutas, ejecutas el registro privado de Docker, yo uso el predeterminado y escucho en el
5000
puertoLuego etiqueto la imagen local y la presiono.
Después de eso, puede usar la API de registro para verificar que exista en su registro privado de acopladores
¡Ahora puedo eliminar la etiqueta usando esa API!
Verifique nuevamente, la etiqueta no existe en su servidor de registro privado
fuente
registry
imagen de la imagen canónica . SSHing y ejecutar un script funciona, incluso si no es ideal. Como nota al margen, sigo pensando que es una API incompleta: puede eliminar etiquetas, pero si lo obtiene/images
, todavía verá todos los datos de imagen restantes.Esto es realmente feo pero funciona, el texto se prueba en el registro: 2.5.1. No logré que la eliminación funcione sin problemas incluso después de actualizar la configuración para habilitar la eliminación. La identificación fue realmente difícil de recuperar, tuve que iniciar sesión para obtenerla, tal vez algún malentendido. De todos modos, lo siguiente funciona:
Inicie sesión en el contenedor
Defina variables que coincidan con su contenedor y la versión del contenedor:
Mover al directorio de registro:
Eliminar archivos relacionados con su hash:
Eliminar manifiestos:
Cerrar sesión
Ejecute el GC:
Si todo se hizo correctamente, se muestra información sobre los blobs eliminados.
fuente
Hay algunos clientes (en Python, Ruby, etc.) que hacen exactamente eso. Para mi gusto, no es sostenible instalar un tiempo de ejecución (por ejemplo, Python) en mi servidor de registro, ¡solo para mantener mi registro!
Entonces
deckschrubber
es mi solución:Las imágenes anteriores a una edad determinada se eliminan automáticamente. La edad puede ser especificado usando
-year
,-month
,-day
, o una combinación de ellos:ACTUALIZACIÓN : aquí hay una breve introducción sobre deckschrubber.
fuente
deckschrubber
es bastante bueno, muy fácil de instalar (binario único) y le permite eliminar imágenes por nombre (con coincidencia de expresiones regulares) y por antigüedad.ERRO[0000] Could not delete image! repo=.... tag=latest
: /Brevemente;
1) Debe escribir el siguiente comando para RepoDigests de un docker repo;
2) Usar la API REST del registro
Debería obtener un 202 Aceptado para una invocación exitosa.
3-) Ejecutar recolector de basura
registro - nombre del contenedor de registro.
Para una explicación más detallada, ingrese la descripción del enlace aquí
fuente
Esta imagen acoplable incluye un script bash que se puede usar para eliminar imágenes de un registro remoto v2: https://hub.docker.com/r/vidarl/remove_image_from_registry/
fuente
Debajo de Bash Script Elimina todas las etiquetas ubicadas en el registro, excepto la última.
Después de esta carrera
fuente
Script simple de ruby basado en esta respuesta: Registry_cleaner .
Puede ejecutarlo en una máquina local:
./registry_cleaner.rb --host=https://registry.exmpl.com --repository=name --tags_count=4
Y luego, en la máquina de registro, elimine los blobs con
/bin/registry garbage-collect /etc/docker/registry/config.yml
.fuente
Aquí hay un guión basado en la respuesta de Yavuz Sert. Elimina todas las etiquetas que no son la última versión, y su etiqueta es superior a 950.
fuente