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:
$ 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"
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.
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
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
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.
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:
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>
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!
Respostas:
Editar 2020
Voltando ao problema do github ( fechado ) , onde é apontado, não há sessão ou estado real;
Como outros apontaram, uma
auths
entrada / nó é adicionado ao~/.docker/config.json
arquivo (isso também funciona para registros privados ) depois de fazer o login com sucesso:Ao fazer logoff, esta entrada é removida:
Conteúdo do docker
config.json
após: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>
Se você já estiver conectado, o prompt será semelhante a:
Para obter a explicação original para a
~/.docker/config.json
, verifique a pergunta: como posso saber se estou conectado a um registro docker privadofonte
~/.docker/config.json
.docker info
aparentemente não é confiável até mesmo para index.docker.io . Atualmente logado bem e só vejo aRegistry
entrada, nãoUsername
.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
: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:
Se você obtiver uma saída como a acima, significa que
logged-in-user
já teve uma sessão ativa comprivate.registry.com
. Se apenas for solicitado o nome de usuário em vez disso, isso indicaria que não há sessão ativa.fonte
Você pode executar o seguinte comando para ver o nome de usuário com o qual está conectado e o registro usado:
fonte
As respostas aqui até agora não são tão úteis:
docker info
não fornece mais esta informaçãodocker logout
é um grande inconveniente - a menos que você já saiba as credenciais e possa facilmente fazer login novamentedocker login
a resposta parece pouco confiável e não tão fácil de analisar pelo programaMinha 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:
fonte
Para registros privados, nada é mostrado em
docker info
. No entanto, o comando logout dirá se você estava conectado:(Embora isso force você a fazer login novamente.)
fonte
O esquema de credencial docker cli é, sem surpresa, descomplicado, basta dar uma olhada:
cat ~/.docker/config.json
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
fonte
docker-credential-wincred.exe <store|get|erase|list|version>
que significa que você podeget
sua senhacat
alias no Powershell ... atualizado para incluir ambosAcabei de verificar, hoje está assim:
NOTA: este é um macOS com a versão mais recente do Docker CE, docker-credential-helper - ambos instalados com homebrew.
fonte
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:
fonte
Se desejar um
true/false
valor simples , você pode canalizar seudocker.json
parajq
.fonte
jq
retornar 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 ...
Use o comando como abaixo:
fonte
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
fonte
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,
fonte