eliminar la imagen de Docker etiquetada del registro privado

¿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 a34a1d5user@ubuntu-user:~$ docker search myregistry:5000/user/imageNAME                                                                     myregistry:5000/user/image:20160119                                         myregistry:5000/user/image:20160119-20160120        user@ubuntu-user:~$ docker rmi myregistry:5000/user/image:20160119-20160120Error response from daemon: could not find image: no such id: myregistry:5000/user/image:20160119-20160120Error: failed to remove images: [myregistry:5000/user/image:20160119-20160120]

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

Una de las opciones que tenemos hoy en día 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. Solo para evitar eliminar accidentalmente el archivo incorrecto, lo probé con este script de github. No asumo ninguna garantía sobre cómo funciona este script (aunque lo verifiqué rápidamente antes de probarlo).

Entonces, hice una prueba y parece que funciona :)

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

[anovil@ubuntu-anovil remove-registry]$ docker psCONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES88f8e1a1d7a7        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 alpine creé alpine:v1 y lo envié a mi registro privado que se ejecuta en localhost:5000. Al consultarlo desde el registro, se devolvió 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 con docker exec y verifiqué el uso del disco antes de hacer mi experimento

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

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

[anovil@ubuntu-anovil remove-registry]$ docker build -t localhost:5000/alpine:v2 .Sending build context to Docker daemon 61.99 MBStep 1 : FROM alpine ---> 2314ad3eeb90Step 2 : COPY mongodb.tgz /mongodb.tgz ---> d7c7645a3fe2Successfully built d7c7645a3fe2[anovil@ubuntu-anovil remove-registry]$ docker push localhost:5000/alpine:v2The 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 62 MB:

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

[6] Para correr delete_docker_registry_image, necesita 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, pruebe con --dry-run opció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-runDRY_RUN: would have deleted tag directory: repositories/alpine/_manifests/tags/v2DRY_RUN: would have deleted manifest revision: repositories/alpine/_manifests/revisions/sha256/7bea1ec2910170bd88412b622aee6129791673cf1fd8c0e1e34f15ec26428774DRY_RUN: would have deleted directory: blobs/sha256/e2/e2cc9aed084e01fa5cf93c09121035ac4d712113425ae68b678c28591beec5c6DRY_RUN: would have deleted directory: blobs/sha256/7a/7ada67971e952e353ab14d8f9bdd4e41e4c41099b05a5da09f2700b51d93908aDRY_RUN: would have deleted directory: blobs/sha256/7b/7bea1ec2910170bd88412b622aee6129791673cf1fd8c0e1e34f15ec26428774DRY_RUN: would have deleted layer metadata directory: repositories/alpine/_layers/sha256/e2cc9aed084e01fa5cf93c09121035ac4d712113425ae68b678c28591beec5c6root@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    totalroot@88f8e1a1d7a7:/#  

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

docker push my/image:1.0.0docker push my/image:1.0.1 # This is brokendocker tag  my/image:1.0.0 my/image:1.0.2docker push my/image:1.0.2

La imagen rota seguirá ahí, pero es poco probable que alguien la use, ya que hay una versión" más nueva " disponible. Obviamente, es mejor arreglarlo hacia adelante, 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 que saliera a la luz, las otras soluciones son mejores, pero asuma que ahora se sabe lo que era y cámbielo (contraseñas, claves, lo que sea).