Onde posso encontrar o código sha256 de uma imagem docker?

94

Eu gostaria de puxar as imagens do CentOS, Tomcat, ... usando seu código sha256, como em

docker pull myimage@sha256:0ecb2ad60

Mas não consigo encontrar o código sha256 para usar em qualquer lugar.

Verifiquei o repositório DockerHub em busca de qualquer dica do código sha256, mas não consegui encontrar nenhum. Eu baixei as imagens por sua tag

docker pull tomcat:7-jre8

e verificou a imagem com docker inspectpara ver se há um código sha256 nos metadados, mas não há nenhum (adicionar o código sha256 da imagem provavelmente mudaria o código sha256).

Devo calcular o código sha256 de uma imagem sozinho e usá-lo?

cristão
fonte
1
Eu criei um problema no dockerhub relacionado a isso - github.com/docker/docker/issues/17670
Michael Barton

Respostas:

97

Última resposta

Edição sugerida por OhJeez nos comentários.

docker inspect --format='{{index .RepoDigests 0}}' $IMAGE

Resposta original

Eu acredito que você também pode conseguir isso usando

docker inspect --format='{{.RepoDigests}}' $IMAGE

Funciona apenas no Docker 1.9 e se a imagem foi originalmente extraída pelo resumo. Os detalhes estão no rastreador de problemas do docker.

Michael Barton
fonte
8
Use docker inspect --format='{{index .RepoDigests 0}}' $IMAGEsem colchetes (retorna o primeiro índice da matriz)
OhJeez
@OhJeez, obrigado, atualizei minha resposta com sua sugestão.
Michael Barton
Pelo menos para mim, isso também funciona para imagens não puxadas por resumo, mas por tag. Isso é com Docker 18.09.7.
sleske
No Windows, use aspas duplas --format = "..." ( github.com/docker/toolbox/issues/433#issuecomment-188790050 )
David
Depois de ler esta postagem, você pode querer dar uma olhada na postagem abaixo também. stackoverflow.com/questions/56364643/…
vaibhavnd
85

Você pode conseguir por docker images --digests

REPOSITORY          TAG    DIGEST                                                                    IMAGE ID     CREATED        SIZE
docker/ucp-agent    2.1.0  sha256:a428de44a9059f31a59237a5881c2d2cffa93757d99026156e4ea544577ab7f3   583407a61900 3 weeks ago    22.3 MB
Rajarajan Pudupatti Sundari Je
fonte
1
Para obter apenas os resumos, você também pode usar docker images --format '{{.Digest}}'. Isso é útil em uma foreachinstrução para fazer algum trabalho com os resumos.
Mark Loyman
22

A forma mais simples e concisa é:

docker images --no-trunc --quiet $IMAGE

Isso retorna apenas a sha256:...string e nada mais.

por exemplo:

$ docker images --no-trunc --quiet debian:stretch-slim
sha256:220611111e8c9bbe242e9dc1367c0fa89eef83f26203ee3f7c3764046e02b248

Editar:

NOTA: isso só funciona para imagens locais. Você pode docker pull $IMAGEprimeiro, se necessário.

Greg Bacchus
fonte
19

Acabei de ver:

Quando eu puxo uma imagem, o código sha256 é exibido na parte inferior da saída (Resumo: sha ....):

docker pull tomcat:7-jre8
7-jre8: Pulling from library/tomcat
902b87aaaec9: Already exists 
9a61b6b1315e: Already exists 
...   
4dcef5c50d60: Already exists 
Digest: sha256:c34ce3c1fcc0c7431e1392cc3abd0dfe2192ffea1898d5250f199d3ac8d8720f
Status: Image is up to date for tomcat:7-jre8

Este código sha

sha256: c34ce3c1fcc0c7431e1392cc3abd0dfe2192ffea1898d5250f199d3ac8d8720f

pode ser usado para puxar a imagem depois com

docker pull tomcat @ sha256: c34ce3c1fcc0c7431e1392cc3abd0dfe2192ffea1898d5250f199d3ac8d8720f

Dessa forma, você pode ter certeza de que a imagem não será alterada e poderá ser usada com segurança para produção.

cristão
fonte
10
Esta não é realmente uma solução completa, pois trata apenas imagens online. E se você quiser o sha256 de uma imagem local?
Zelphir Kaltstahl
7

Além das respostas existentes, você pode usar a --digestsopção ao fazer docker imagespara obter uma lista de resumos de todas as imagens que possui.

docker images --digests

Você pode adicionar um grep para aprofundar mais

docker images --digests | grep tomcat
BKC
fonte
5

Este deveria ser o campo Id, que você pode ver na API Docker Hub obsoleta

GET /v1/repositories/foo/bar/images HTTP/1.1
  Host: index.docker.io
  Accept: application/json

Parameters:

namespace – the namespace for the repo
repo_name – the name for the repo

Resposta de exemplo:

HTTP/1.1 200
Vary: Accept
Content-Type: application/json

[{"id": "9e89cc6f0bc3c38722009fe6857087b486531f9a779a0c17e3ed29dae8f12c4f",
"checksum": "b486531f9a779a0c17e3ed29dae8f12c4f9e89cc6f0bc3c38722009fe6857087"},
{"id": "ertwetewtwe38722009fe6857087b486531f9a779a0c1dfddgfgsdgdsgds",
"checksum": "34t23f23fc17e3ed29dae8f12c4f9e89cc6f0bsdfgfsdgdsgdsgerwgew"}]

MAS: não é assim que funciona agora com a nova distribuição docker .
Consulte o problema 628: "Obter ID de imagem com nome de tag"

A /v1/resposta do registro /repositories/<repo>/tagsusada para listar o ID da imagem junto com o identificador da tag.
/v2/só parece dar o controle.

Seria útil obter o ID para comparar com o ID encontrado localmente. O único lugar em que posso encontrar o ID é na v1Compatseção do manifesto (o que é um exagero para as informações que desejo)

A resposta atual (meados de 2015) é:

Essa propriedade da API V1 era muito cara em termos computacionais para a maneira como as imagens são armazenadas no backend. Apenas os nomes das marcas são enumerados para evitar uma pesquisa secundária.
Além disso, a API V2 não lida com IDs de imagem. Em vez disso, ele usa resumos para identificar camadas, que podem ser calculadas como propriedade da camada e são verificáveis ​​de forma independente.

VonC
fonte
4

Descobri que os métodos acima não funcionam em alguns casos. Eles também:

  • não lida bem com várias imagens com o mesmo hash (no caso da sugestão de .RepoDigests - quando você deseja usar um caminho de registro específico)
  • não funciona bem ao enviar a imagem para registros (no caso de .Id onde é um hash local, não o hash no registro).

O método abaixo é delicado, mas funciona para extrair o 'nome' completo específico e o hash para um contêiner empurrado específico.

Este é o cenário - uma imagem é carregada separadamente para 2 projetos diferentes no mesmo repo, portanto, consultar RepoDigests retorna 2 resultados.

$ docker inspect --format='{{.RepoDigests}}' gcr.io/alpha/homeapp:latest

[gcr.io/alpha/homeapp@sha256:ce7395d681afeb6afd68e73a8044e4a965ede52cd0799de7f97198cca6ece7ed gcr.io/beta/homeapp@sha256:ce7395d681afeb6afd68e73a8044e4a965ede52cd0799de7f97198cca6ece7ed]

Quero usar o resultado alfa, mas não posso prever qual índice será. Portanto, preciso manipular a saída do texto para remover os colchetes e obter cada entrada em uma linha separada. A partir daí, posso facilmente pegar o resultado.

$ docker inspect --format='{{.RepoDigests}}' gcr.io/alpha/homeapp:latest | sed 's:^.\(.*\).$:\1:' | tr " " "\n" | grep alpha

gcr.io/alpha/homeapp@sha256:ce7395d681afeb6afd68e73a8044e4a965ede52cd0799de7f97198cca6ece7ed 
gambitx28
fonte
3

Conforme mencionado por @zelphir, usar resumos não é uma boa maneira, pois não existe para uma imagem somente local. Presumo que a ID da imagem sha é a mais precisa e consistente em tags / puxar / empurrar etc.

docker inspect --format='{{index .Id}}' $IMAGE

Faz o truque.

Kristofer
fonte
2

Você pode encontrá-lo no momento de puxar a imagem do respectivo repositório. O comando abaixo menciona Digest: sha256 no momento de puxar a imagem do docker.

09:33 AM##~::>docker --version
Docker version 19.03.4, build 9013bf5

Resumo: sha256: 6e9f67fa63b0323e9a1e587fd71c561ba48a034504fb804fd26fd8800039835d

09:28 AM##~::>docker pull ubuntu
Using default tag: latest
latest: Pulling from library/ubuntu
7ddbc47eeb70: Pull complete
c1bbdc448b72: Pull complete
8c3b70e39044: Pull complete
45d437916d57: Pull complete
**Digest: sha256:6e9f67fa63b0323e9a1e587fd71c561ba48a034504fb804fd26fd8800039835d**
Status: Downloaded newer image for ubuntu:latest
docker.io/library/ubuntu:latest

Assim que a imagem for baixada, podemos fazer o seguinte

"ubuntu @ sha256: 6e9f67fa63b0323e9a1e587fd71c561ba48a034504fb804fd26fd8800039835d"

09:36 AM##~::>docker inspect ubuntu | grep -i sha256
        "Id": "sha256:775349758637aff77bf85e2ff0597e86e3e859183ef0baba8b3e8fc8d3cba51c",
            **"ubuntu@sha256:6e9f67fa63b0323e9a1e587fd71c561ba48a034504fb804fd26fd8800039835d"**
            "Image": "sha256:f0caea6f785de71fe8c8b1b276a7094151df6058aa3f22d2902fe6b51f1a7a8f",
            "Image": "sha256:f0caea6f785de71fe8c8b1b276a7094151df6058aa3f22d2902fe6b51f1a7a8f",
                "sha256:cc967c529ced563b7746b663d98248bc571afdb3c012019d7f54d6c092793b8b",
                "sha256:2c6ac8e5063e35e91ab79dfb7330c6154b82f3a7e4724fb1b4475c0a95dfdd33",
                "sha256:6c01b5a53aac53c66f02ea711295c7586061cbe083b110d54dafbeb6cf7636bf",
                "sha256:e0b3afb09dc386786d49d6443bdfb20bc74d77dcf68e152db7e5bb36b1cca638"
forkdbloke
fonte
1

Basta emitir docker pull tomcat:7-jre8novamente e você obterá o que deseja.

petertc
fonte