eliminar la imagen etiquetada de Docker del registro privado


10

¿Cómo puedo eliminar una etiqueta agregada por error de una imagen en un registro privado de Docker? La opción -rmi no parece funcionar para imágenes remotas en Docker 1.9.1.

user@ubuntu-user:~$ docker --version  
Docker version 1.9.1, build a34a1d5

user@ubuntu-user:~$ docker search myregistry:5000/user/image
NAME                                                                     
myregistry:5000/user/image:20160119                                         
myregistry:5000/user/image:20160119-20160120        

user@ubuntu-user:~$ docker rmi myregistry:5000/user/image:20160119-20160120
Error response from daemon: could not find image: no such id: myregistry:5000/user/image:20160119-20160120
Error: failed to remove images: [myregistry:5000/user/image:20160119-20160120]

Respuestas:


9

Parece que no existe un método simple para eliminar imágenes del registro a partir de hoy y parece que es una característica para el hito del registro 2.1 .

Una de las opciones que tenemos hoy con esto no funciona

anovil@ubuntu-anovil remove-registry]$ curl -X DELETE localhost:5000/v2/alpine/manifests/v1
{"errors":[{"code":"UNSUPPORTED","message":"The operation is unsupported."}]}
[anovil@ubuntu-anovil remove-registry]$ 

es eliminarlo manualmente del registro mismo. Solo para evitar eliminar accidentalmente un archivo incorrecto, lo probé con este script de github . No garantizo cómo funciona este script (aunque lo revisé rápidamente antes de probarlo).

Entonces, hice una prueba y eso parece funcionar :)

[1] Supongo que está ejecutando un registro con docker.

[anovil@ubuntu-anovil remove-registry]$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
88f8e1a1d7a7        registry:2          "/bin/registry /etc/d"   37 minutes ago      Up 37 minutes       0.0.0.0:5000->5000/tcp   registry
[anovil@ubuntu-anovil remove-registry]$ 

[2] Creé un Dockerfile mínimo con solo FROM alpinecontenido y creé alpine: v1 y lo envié a mi registro privado ejecutándose en localhost: 5000. Al consultarlo desde el registro, regresó como se esperaba.

[anovil@ubuntu-anovil remove-registry]$ curl -X GET localhost:5000/v2/alpine/tags/list
{"name":"alpine","tags":["v1"]}
[anovil@ubuntu-anovil remove-registry]$ 

[3] Luego inicio sesión en el registro docker execy compruebo el uso del disco antes de hacer mi experimento

root@88f8e1a1d7a7:/# du -sch /var/lib/registry/                     
2.5M    /var/lib/registry/
2.5M    total
root@88f8e1a1d7a7:/# 

[4] Después de regresar a mi host, copié un archivo pesado (mongodb.tgz) en mi contenedor y creé una versión compilada y empujada v2.

[anovil@ubuntu-anovil remove-registry]$ docker build -t localhost:5000/alpine:v2 .
Sending build context to Docker daemon 61.99 MB
Step 1 : FROM alpine
 ---> 2314ad3eeb90
Step 2 : COPY mongodb.tgz /mongodb.tgz
 ---> d7c7645a3fe2
Successfully built d7c7645a3fe2
[anovil@ubuntu-anovil remove-registry]$ docker push localhost:5000/alpine:v2
The push refers to a repository [localhost:5000/alpine] (len: 1)
d7c7645a3fe2: Pushed 
5ff05309724e: Image already exists 
v2: digest: sha256:7bea1ec2910170bd88412b622aee6129791673cf1fd8c0e1e34f15ec26428774 size: 4467
[anovil@ubuntu-anovil remove-registry]$ 

[5] Después de verificar el tamaño nuevamente en el registro, ha aumentado a 62MB:

root@88f8e1a1d7a7:/# du -sch /var/lib/registry/                                                                               
62M /var/lib/registry/
62M total
root@88f8e1a1d7a7:/# 

[6] Para poder ejecutarlo delete_docker_registry_image, necesitas obtener el script en el contenedor que aloja el registro, una opción para hacerlo es con curl. Además, este script requiere jq.

root@88f8e1a1d7a7:/# apt-get update && apt-get install -y curl jq
...
root@88f8e1a1d7a7:/#

[7] Ejecute el script, intente con la --dry-runopción primero y no olvide la etiqueta de versión (v2 en este caso), también hay una buena-h

root@88f8e1a1d7a7:/# delete_docker_registry_image --image alpine:v2 --dry-run
DRY_RUN: would have deleted tag directory: repositories/alpine/_manifests/tags/v2
DRY_RUN: would have deleted manifest revision: repositories/alpine/_manifests/revisions/sha256/7bea1ec2910170bd88412b622aee6129791673cf1fd8c0e1e34f15ec26428774
DRY_RUN: would have deleted directory: blobs/sha256/e2/e2cc9aed084e01fa5cf93c09121035ac4d712113425ae68b678c28591beec5c6
DRY_RUN: would have deleted directory: blobs/sha256/7a/7ada67971e952e353ab14d8f9bdd4e41e4c41099b05a5da09f2700b51d93908a
DRY_RUN: would have deleted directory: blobs/sha256/7b/7bea1ec2910170bd88412b622aee6129791673cf1fd8c0e1e34f15ec26428774
DRY_RUN: would have deleted layer metadata directory: repositories/alpine/_layers/sha256/e2cc9aed084e01fa5cf93c09121035ac4d712113425ae68b678c28591beec5c6
root@88f8e1a1d7a7:/# delete_docker_registry_image --image alpine:v2          
root@88f8e1a1d7a7:/#

[8] ¡Y listo!

root@88f8e1a1d7a7:/# du -sch /var/lib/registry/                     
2.5M    /var/lib/registry/
2.5M    total
root@88f8e1a1d7a7:/#  


0

Hace poco me encontré con esto, pero luego pensé, ¿por qué eliminarlo? Solo volveré a lanzar una versión anterior:

docker push my/image:1.0.0
docker push my/image:1.0.1 # This is broken

docker tag  my/image:1.0.0 my/image:1.0.2
docker push my/image:1.0.2

La imagen rota seguirá estando allí, pero es poco probable que alguien la use ya que hay una versión "más nueva" disponible. Obviamente, es mejor solucionarlo, pero en caso de apuro, esta es una solución rápida.

Si la razón por la que desea eliminarlo es que tiene secretos o algo expuesto que no quería revelar, las otras soluciones son mejores, pero suponga que lo que era ahora es conocido y cámbielo (contraseñas, claves, lo que sea).


1
Entonces, ¿el espacio de almacenamiento requerido crece y crece a medida que se empujan más imágenes pero nunca se purgan?
emmdee

@emmdee bueno, quiero decir sí ... pero recuerda, en cuanto al disco, solo almacena los deltas entre revisiones, al igual que git. para una imagen que termina en 1 GB, eso no significa que cada vez que lanza una nueva versión, se usan otros 1 GB en el disco.
Michael Butler
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.