Solución:
Actualmente, no puede utilizar 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 se eliminan todas las etiquetas asociadas a este repositorio.
Eliminar una etiqueta significa que se elimina la asociación entre una imagen y una etiqueta.
Ninguno de los anteriores eliminará una sola imagen. Se dejan en su disco.
Solución alterna
Para esta solución, debe tener las imágenes de la ventana acoplable almacenadas localmente.
Una solución alternativa para su solución sería eliminar todas las etiquetas excepto las más recientes y, por lo tanto, eliminar potencialmente la referencia a las imágenes asociadas. Entonces puedes correr este guión para eliminar todas las imágenes, que no están referenciadas por ninguna etiqueta o la ascendencia de ninguna imagen utilizada.
Terminología (imágenes y etiquetas)
Considere un gráfico de imagen como este donde las letras mayúsculas (A
, B
, …) representan ID de imagen cortos y <-
significa que una imagen se basa en otra imagen:
A <- B <- C <- D
Ahora agregamos etiquetas a la imagen:
A <- B <- C <- D
| |
| <version2>
<version1>
Aquí, la etiqueta <version1>
hace referencia a la imagen C
y la etiqueta <version2>
hace referencia a la imagen D
.
Refinando tu pregunta
En tu pregunta dijiste que querías eliminar
todas las imágenes menos la
latest
. Ahora bien, esta terminología no es del todo correcta. Has mezclado imágenes y etiquetas. Al mirar 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:
A <- B <- C <- D
| |
| <version2>
| <latest>
<version1>
Desde el <latest>
imagen de referencias de etiqueta D
Te pregunto: ¿de verdad quieres borrar todo menos la imagen? D
? ¡Probablemente no!
¿Qué pasa si borras una etiqueta?
Si borra la etiqueta <version1>
usando la API REST de Docker obtendrá esto:
A <- B <- C <- D
|
<version2>
<latest>
Recordar: ¡Docker nunca eliminará una imagen! Incluso si lo hiciera, en este caso no puede eliminar una imagen, ya que la imagen C
es parte de la ascendencia de la imagen D
que está etiquetado.
Incluso si usa este guión, no se eliminará ninguna imagen.
Cuando se puede borrar una imagen
Con la condición de que pueda controlar cuándo alguien puede acceder a su registro (por ejemplo, desactivando 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.
Observe que en el siguiente gráfico, la imagen D
es no Residencia en C
pero en B
. Por lo tanto, D
no depende de C
. Si elimina la etiqueta <version1>
en este gráfico, la imagen C
no será utilizado por ninguna imagen y este guión puede eliminarlo.
A <- B <--------- D
|
<version2>
<latest>
<- C
|
<version1>
Después de la limpieza, su gráfico de imagen se ve así:
A <- B <- D
|
<version2>
<latest>
¿Es esto lo que quieres?
Enfrenté el mismo problema con mi registro y luego probé la solución que se enumera 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:
http://YourPrivateRegistyIP:5000/v2/_catalog
La respuesta tendrá el siguiente formato:
{
"repositories": [
<name>,
...
]
}
Paso 2: enumerar las etiquetas para el catálogo relacionado
Puede enumerar las etiquetas de su catálogo llamando a esta URL:
http://YourPrivateRegistyIP:5000/v2/<name>/tags/list
La respuesta tendrá el siguiente formato:
{
"name": <name>,
"tags": [
<tag>,
...
]
}
Paso 3: enumere el valor del manifiesto para la etiqueta relacionada
Puede ejecutar este comando en el contenedor de registro de Docker:
curl -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)}'
La respuesta tendrá el siguiente formato:
sha256:6de813fb93debd551ea6781e90b02f1f93efab9d882a6cd06bbd96a07188b073
Ejecute el comando que se indica a continuación con el valor de manifiesto:
curl -v --silent -H "Accept: application/vnd.docker.distribution.manifest.v2+json" -X DELETE http://127.0.0.1:5000/v2/<name>/manifests/sha256:6de813fb93debd551ea6781e90b02f1f93efab9d882a6cd06bbd96a07188b073
Paso 4: eliminar manifiestos marcados
Ejecute este comando en su contenedor de registro de Docker:
bin/registry garbage-collect /etc/docker/registry/config.yml
Aquí está mi config.yml
[email protected]:/etc# cat /etc/docker/registry/config.yml
version: 0.1
log:
fields:
service: registry
storage:
cache:
blobdescriptor: inmemory
filesystem:
rootdirectory: /var/lib/registry
delete:
enabled: true
http:
addr: :5000
headers:
X-Content-Type-Options: [nosniff]
health:
storagedriver:
enabled: true
interval: 10s
threshold: 3
La corriente v2
el registro ahora admite la eliminación a través de DELETE /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>
se puede recuperar solicitando a
GET /v2/<name>/manifests/<tag>
y comprobando el Docker-Content-Digest
encabezado en la respuesta.
Edición 2: es posible que deba ejecutar su registro con el siguiente conjunto de entorno:
REGISTRY_STORAGE_DELETE_ENABLED="true"
Edit3: es posible que deba ejecutar la recolección de basura para liberar este espacio en el disco: https://docs.docker.com/registry/garbage-collection/