我不确定是否已经使用cmd:docker login在cmd行中登录到Docker注册表。如何在不尝试推送的情况下测试或查看是否已登录?
我不确定是否已经使用cmd:docker login在cmd行中登录到Docker注册表。如何在不尝试推送的情况下测试或查看是否已登录?
Answers:
编辑2020
再次提到(已关闭的)github问题,指出那里没有实际的会话或状态。
docker login实际上并没有创建任何持久性会话,它只是将用户的凭据存储在磁盘上,以便在需要身份验证时可以读取它们以登录
正如其他人指出的那样,成功登录后,会将auths条目/节点添加到~/.docker/config.json文件中(这也适用于私有注册表):
{
"auths": {
"https://index.docker.io/v1/": {}
},
...
注销时,此条目将被删除:
$ docker logout
Removing login credentials for https://index.docker.io/v1/
docker的内容如下config.json:
{
"auths": {},
...
可以通过您的脚本或代码来解析此文件,以检查您的登录状态。
您可以使用登录到docker 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:
如果您已经登录,则提示如下:
$ 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"
有关的原始说明~/.docker/config.json,请检查问题:如何确定我是否已登录到私有Docker注册表?
~/.docker/config.json。
docker info即使对于index.docker.io,显然也不可靠。当前已登录,只能看到Registry条目,否Username。
我使用以下两种方法之一进行此检查:
如果您登录到“ private.registry.com”,您将看到与以下内容相同的条目~/.docker/config.json:
"auths": {
"private.registry.com": {
"auth": "gibberishgibberishgibberishgibberishgibberishgibberish"
}
}
如果要查看是否已经与private.registry.com建立了活动会话,请尝试重新登录:
bash$ docker login private.registry.com
Username (logged-in-user):
如果您收到类似上述的输出,则表示logged-in-user已与进行了活动会话private.registry.com。如果只是提示您输入用户名,则表明没有活动的会话。
您可以执行以下命令来查看用于登录的用户名和使用的注册表:
docker system info | grep -E 'Username|Registry'
到目前为止,这里的答案不是那么有用:
docker info 不再提供此信息docker logout 不便之处-除非您已经知道凭据并且可以轻松重新登录docker login 响应似乎非常不可靠,并且程序不太容易解析适用于我的解决方案基于@noobuntu的注释:我认为,如果我已经知道要提取的图像,但是不确定用户是否已经登录,则可以执行以下操作:
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)
毫不奇怪,docker cli凭据方案并不复杂,只需看一下:
cat ~/.docker/config.json
{
"auths": {
"dockerregistry.myregistry.com": {},
"https://index.docker.io/v1/": {}
这在Windows上存在(使用Get-Content ~\.docker\config.json),您还可以在凭证工具中戳一下,该凭证工具还会列出用户名...,我想您甚至可以检索密码
. "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>这意味着您可以输入get密码
cat在PowerShell中的别名...更新,包括
如果您想要一个简单的true/false值,可以通过管道将其docker.json传递给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返回正确的退出代码,然后无需进行字符串比较:is_logged_in() { jq -e --arg url ${ADDRESS} '.auths | has($url)' ~/.docker/config.json > /dev/null; }; if is_logged_in; then ...
使用如下命令:
docker info | grep 'name'
WARNING: No swap limit support
Username: <strong>jonasm2009</strong>
在Windows上,您可以通过查看以下文件检查登录“授权”(授权): [USER_HOME_DIR] .docker \ config.json
示例: c:\ USERS \ YOUR_USERANME.docker \ config.json
Windows凭据看起来像这样
{
"auths": {
"HOST_NAME_HERE": {},
"https://index.docker.io/v1/": {}
},
"HttpHeaders": {
"User-Agent": "Docker-Client/18.09.0 (windows)"
},
"credsStore": "wincred",
"stackOrchestrator": "swarm"
}
如@Christian所指出的,最好先尝试操作,然后仅在必要时登录。问题在于,“如果需要的话”并不是很明显地需要稳健地执行。一种方法是将docker操作的stderr与一些已知字符串(通过反复试验)进行比较。例如,
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!