Como saber se o docker já está conectado a um servidor de registro do docker

116

Não tenho certeza se já efetuei login em um registro do docker na linha cmd usando cmd: docker login. Como você pode testar ou ver se está logado ou não, sem tentar fazer push?

Ville Miekk-oja
fonte
Não tenho certeza se entendi sua pergunta? quer saber se está logado em um terminal? por que não executar o comando % docker images no terminal e ver se suas imagens aparecem?
noobuntu,
1
Quero saber se estou conectado ao registro do dockerhub no terminal. Achei que as imagens eram locais, então mostrarei apenas as imagens locais, não as imagens do dockerhub.
Ville Miekk-oja
1
Acredito que, uma vez que você esteja logado no docker, estará conectado ao registro do dockerhub. Não acho que haja um login separado
noobuntu

Respostas:

64

Editar 2020

Voltando ao problema do github ( fechado ) , onde é apontado, não há sessão ou estado real;

Na verdade, o docker login não está criando nenhum tipo de sessão persistente, apenas armazenando as credenciais do usuário no disco para que, quando a autenticação for necessária, ele possa lê-las para fazer o login

Como outros apontaram, uma authsentrada / nó é adicionado ao ~/.docker/config.jsonarquivo (isso também funciona para registros privados ) depois de fazer o login com sucesso:

{
    "auths": {
            "https://index.docker.io/v1/": {}
    },
    ...

Ao fazer logoff, esta entrada é removida:

$ docker logout
Removing login credentials for https://index.docker.io/v1/

Conteúdo do docker config.jsonapós:

{
    "auths": {},
    ...

Este arquivo pode ser analisado por seu script ou código para verificar seu status de login.

Método alternativo (novo login)

Você pode fazer login no docker com docker login <repository>

$ docker login
Login with your Docker ID to push and pull images from Docker Hub. If 
you don't have a Docker ID, head over to https://hub.docker.com to 
create one.
Username:

Se você já estiver conectado, o prompt será semelhante a:

$ docker login
Login with your Docker ID to push and pull images from Docker Hub. If 
you don't have a Docker ID, head over to https://hub.docker.com to 
create one.
Username (myusername):        # <-- "myusername"

Para obter a explicação original para a ~/.docker/config.json, verifique a pergunta: como posso saber se estou conectado a um registro docker privado

Francesco de Guytenaere
fonte
4
O último link fala sobre como verificar o conteúdo de ~/.docker/config.json.
dusan
3
docker infoaparentemente não é confiável até mesmo para index.docker.io . Atualmente logado bem e só vejo a Registryentrada, não Username.
famousgarkin
3
as informações do docker não mostram mais o nome de usuário. Estou no Windows, com docker versão 18.05.0-ce.
Giovanni Bassi de
3
E se um script precisar ser verificado?
Teekin
Isso só funciona para o hub principal do docker, eu acho. Authing para qualquer outro repo, você terá que verificar seu arquivo config.json.
duane
43

Eu uso uma das duas maneiras a seguir para essa verificação:

1: Ver arquivo config.json:

Caso você esteja logado em "private.registry.com", você verá uma entrada para o mesmo como a seguir em ~/.docker/config.json:

"auths": {
    "private.registry.com": {
        "auth": "gibberishgibberishgibberishgibberishgibberishgibberish"
    }
 }

2: Tente o login do docker mais uma vez:

Se você está tentando ver se já tem uma sessão ativa com private.registry.com, tente fazer o login novamente:

bash$ docker login private.registry.com
Username (logged-in-user):

Se você obtiver uma saída como a acima, significa que logged-in-userjá teve uma sessão ativa com private.registry.com. Se apenas for solicitado o nome de usuário em vez disso, isso indicaria que não há sessão ativa.

Arnab
fonte
14

Você pode executar o seguinte comando para ver o nome de usuário com o qual está conectado e o registro usado:

docker system info | grep -E 'Username|Registry'
Miira ben sghaier
fonte
6

As respostas aqui até agora não são tão úteis:

  • docker info não fornece mais esta informação
  • docker logout é um grande inconveniente - a menos que você já saiba as credenciais e possa facilmente fazer login novamente
  • docker login a resposta parece pouco confiável e não tão fácil de analisar pelo programa

Minha solução que funcionou para mim baseia-se no comentário de @noobuntu : Eu percebi que se eu já conhecia a imagem que desejo extrair, mas não tenho certeza se o usuário já está logado, posso fazer isso:

try pulling target image
-> on failure:
   try logging in
   -> on failure: throw CannotLogInException
   -> on success:
      try pulling target image
      -> on failure: throw CannotPullImageException
      -> on success: (continue)
-> on success: (continue)
cristão
fonte
Esta é de longe a melhor estratégia: apenas tente puxar, se falhar, então não está logado (o resto da lógica que você tem vai depender de cada caso de uso, mas a primeira tentativa é universalmente aplicável).
Oliver
2
No entanto, alguém apontou em github.com/moby/moby/issues/15466 que há muitos motivos para a falha, não apenas o problema de login, mas o status de saída do docker não permite diferenciar o motivo da falha. Ainda é melhor do que as outras soluções, mas uma solução completa exigiria um patch para docker.
Oliver
5

Para registros privados, nada é mostrado em docker info. No entanto, o comando logout dirá se você estava conectado:

 $ docker logout private.example.com
 Not logged in to private.example.com

(Embora isso force você a fazer login novamente.)

Wilfred Hughes
fonte
5

O esquema de credencial docker cli é, sem surpresa, descomplicado, basta dar uma olhada:

cat ~/.docker/config.json

{
  "auths": {
    "dockerregistry.myregistry.com": {},
    "https://index.docker.io/v1/": {}

Isso existe no Windows (use Get-Content ~\.docker\config.json) e você também pode dar uma olhada na ferramenta de credencial que também lista o nome de usuário ... e eu acho que você pode até recuperar a senha

. "C:\Program Files\Docker\Docker\resources\bin\docker-credential-wincred.exe" list

{"https://index.docker.io/v1/":"kcd"}
KCD
fonte
No Windows, você pode ver apenas o nome de usuário, a senha é armazenada no gerenciador de credenciais (painel de controle)
Thorbjørn Ravn Andersen
Acho que vou estragar a surpresa ... o docker-credential-wincred.exe <store|get|erase|list|version>que significa que você pode getsua senha
KCD
Esse comando cat deve usar separadores de caminho do Linux: cat ~ / .docker / config.json. Isso pode parecer uma picuinha para alguns, mas outros leitores podem apenas copiar / colar e tentar, e não perceber prontamente que o erro "nenhum arquivo ou diretório" é devido a isso. :-)
charlie arehart
@charliearehart você subestima minha preguiça, eu estava usando o catalias no Powershell ... atualizado para incluir ambos
KCD
@KCD, ah. :-) Obrigado por esclarecer.
Charlie Arehart
4

Acabei de verificar, hoje está assim:

$ docker login
Authenticating with existing credentials...
Login Succeeded

NOTA: este é um macOS com a versão mais recente do Docker CE, docker-credential-helper - ambos instalados com homebrew.

todd_dsm
fonte
3

Pelo menos no "Docker para Windows", você pode ver se está conectado ao hub do docker pela interface do usuário. Basta clicar com o botão direito no ícone do docker na área de notificação do Windows: Docker conectado

BaluJr.
fonte
1
e as versões do docker sem a GUI? ou não-windows?
Zameer Fouzan
1
Então você tem que usar uma das abordagens das outras respostas.
BaluJr.
2

Se desejar um true/falsevalor simples , você pode canalizar seu docker.jsonpara jq.

is_logged_in() {
  cat ~/.docker/config.json | jq -r --arg url "${REPOSITORY_URL}" '.auths | has($url)'
}

if [[ "$(is_logged_in)" == "false" ]]; then
  # do stuff, log in
fi
mcw
fonte
2
Você pode ter que jqretornar um código de saída adequado e então não precisa fazer comparações de strings:is_logged_in() { jq -e --arg url ${ADDRESS} '.auths | has($url)' ~/.docker/config.json > /dev/null; }; if is_logged_in; then ...
Guss
Agradável! Obrigado!
mcw
1

Use o comando como abaixo:

docker info | grep 'name'

WARNING: No swap limit support
Username: <strong>jonasm2009</strong>
Meng Jonas
fonte
Se você já estiver conectado a um registro do docker, apenas use ! [Insira a descrição da imagem aqui ] ( i.stack.imgur.com/JkCxn.png ) Você verá a resposta.
Meng Jonas
1

No Windows, você pode inspecionar as "autorizações" de login (auths) observando este arquivo: [USER_HOME_DIR] .docker \ config.json

Exemplo: c: \ USERS \ YOUR_USERANME.docker \ config.json

Será algo assim para credenciais do Windows

{
"auths": {
    "HOST_NAME_HERE": {},
    "https://index.docker.io/v1/": {}
},
"HttpHeaders": {
    "User-Agent": "Docker-Client/18.09.0 (windows)"
},
"credsStore": "wincred",
"stackOrchestrator": "swarm"
}
atom88
fonte
0

Como apontado por @Christian, é melhor tentar a operação primeiro e depois fazer o login apenas se necessário. O problema é que "se necessário" não é tão óbvio para ser feito de forma robusta. Uma abordagem é comparar o stderr da operação docker com algumas strings conhecidas (por tentativa e erro). Por exemplo,

try "docker OPERATION"
if it failed: 
    capture the stderr of "docker OPERATION"
    if it ends with "no basic auth credentials": 
        try docker login
    else if it ends with "not found":
        fatal error: image name/tag probably incorrect
    else if it ends with <other stuff you care to trap>:
        ...
    else:
        fatal error: unknown cause

try docker OPERATION again
if this fails: you're SOL!
Oliver
fonte