remover tagged Docker imagem do registro privado

Como posso excluir uma tag adicionada por engano de uma imagem em um registro privado do Docker? A opção-rmi não parece funcionar para imagens remotas no 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 não haver um método simples para remover imagens do registro a partir de hoje e parece ser um recurso para registro 2.1 Marco.

Uma das opções que temos hoje com isso não está funcionando

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]$ 

é removê-lo manualmente do próprio registro. Só para evitar remover o arquivo errado acidentalmente, testei com este script do github. Não tenho Garantia de como esse script funciona (embora eu tenha verificado rapidamente antes de testá-lo).

Então, fiz um teste e isso parece funcionar:)

[1] presumo que você esteja executando um registro com o próprio 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] eu criei um Dockerfile mínimo com apenas FROM alpine conteúdo e criado alpine: v1 e enviado para meu registro privado em execução no localhost: 5000. Consultando-o do registro, ele retornou conforme o esperado.

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

[3] Então eu entro no registro com docker exec e verifiquei o uso do disco antes de fazer meu experimento

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

[4] Depois de retornar ao meu host, copiei um arquivo pesado (mongodb.tgz) no meu contêiner e criou uma versão V2 construída e empurrada.

[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] Depois de verificar o tamanho novamente no registro, ele aumentou para 62 MB:

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

[6] para executar delete_docker_registry_image, você precisa obter o script no contêiner que está hospedando o registro, uma opção para fazer isso é com curl. Além disso, este script requer jq.

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

[7] execute o script, tente com --dry-run opção Primeiro e não se esqueça da tag Versão (v2 neste caso), há também uma boa -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] e voila !!

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

Recentemente, entrei nisso sozinho, mas pensei, por que excluir, vou apenas relançar uma versão mais antiga:

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

A imagem quebrada ainda estará lá, mas é improvável que alguém a use, pois há uma versão" mais recente " disponível. Obviamente, é melhor corrigir para a frente, mas em uma pitada esta é uma solução rápida.

Se a razão pela qual você deseja excluí-lo é que ele tem segredos ou algo exposto, você não queria sair, as outras soluções são melhores, mas assuma o que quer que fosse agora conhecido e altere-o (senhas, chaves, o que quer).