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?


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


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.


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'

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)

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.)


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"}

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.


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


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

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

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"
}

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!
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.