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 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?
Respostas:
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 auths
entrada / nó é adicionado ao ~/.docker/config.json
arquivo (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.json
após:
{
"auths": {},
...
Este arquivo pode ser analisado por seu script ou código para verificar seu status de 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
~/.docker/config.json
.
docker info
aparentemente não é confiável até mesmo para index.docker.io . Atualmente logado bem e só vejo a Registry
entrada, não Username
.
Eu uso uma das duas maneiras a seguir para essa verificação:
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"
}
}
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-user
já 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.
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'
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:
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)
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.)
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"}
docker-credential-wincred.exe <store|get|erase|list|version>
que significa que você pode get
sua senha
cat
alias no Powershell ... atualizado para incluir ambos
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:
Se desejar um true/false
valor simples , você pode canalizar seu docker.json
para 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
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:
docker info | grep 'name'
WARNING: No swap limit support
Username: <strong>jonasm2009</strong>
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"
}
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!