如何知道Docker是否已经登录到Docker注册表服务器


116

我不确定是否已经使用cmd:docker login在cmd行中登录到Docker注册表。如何在不尝试推送的情况下测试或查看是否已登录?


不确定我了解您的问题吗?您是否想知道是否已在终端上登录?为什么不在终端中运行%docker images命令并查看图像是否显示?
noobuntu

1
我想知道我是否已登录终端中的dockerhub注册表。我以为图像是本地的,所以它只会显示本地图像,而不是dockerhub图像。
Ville Miekk-oja '16

1
我相信,一旦您登录到docker,就可以连接到dockerhub注册表。我认为没有单独的登录信息
noobuntu

Answers:


63

编辑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注册表?


4
最后一个链接讨论有关检查的内容~/.docker/config.json
dusan

2
docker info即使对于index.docker.io,显然也不可靠。当前已登录,只能看到Registry条目,否Username
18/25/18

3
码头工人信息不再显示用户名。我在Windows上,使用docker版本18.05.0-ce。
乔瓦尼·巴西

3
如果脚本需要检查怎么办?
Teekin

我认为这仅适用于主要的docker hub。对任何其他存储库进行身份验证时,您都必须检查config.json文件。
duane

43

我使用以下两种方法之一进行此检查:

1:查看config.json文件:

如果您登录到“ private.registry.com”,您将看到与以下内容相同的条目~/.docker/config.json

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

2:再次尝试docker登录:

如果要查看是否已经与private.registry.com建立了活动会话,请尝试重新登录:

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

如果您收到类似上述的输出,则表示logged-in-user已与进行了活动会话private.registry.com。如果只是提示您输入用户名,则表明没有活动的会话。


13

您可以执行以下命令来查看用于登录的用户名和使用的注册表:

docker system info | grep -E 'Username|Registry'

6

到目前为止,这里的答案不是那么有用:

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

到目前为止,这是最好的策略:只需尝试拉取,如果失败,则不登录(其余逻辑取决于每个用例,但第一次尝试是通用的)。
奥利弗

2
但是有人在github.com/moby/moby/issues/15466上指出失败的原因有很多,不仅是登录问题,而且docker退出状态无法区分失败的原因。它仍然比其他解决方案要好,但是完整的解决方案将需要对Docker进行补丁。
奥利弗

5

对于私人注册表,不会显示任何内容docker info。但是,注销命令将告诉您是否已登录:

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

(尽管这将迫使您再次登录。)


5

毫不奇怪,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"}

你只能看到用户名窗口,该密码存储在凭据管理器(控制面板)
托尔比约恩Ravn的安德森

我想我会破坏这个惊喜... docker-credential-wincred.exe <store|get|erase|list|version>这意味着您可以输入get密码
-KCD

该cat命令应使用linux路径分隔符:cat〜/ .docker / config.json。在某些人看来,这似乎是挑剔的选择,但其他读者可能只是复制/粘贴并尝试使用它,而不能轻易意识到“没有这样的文件或目录”错误是由于此而引起的。:-)
查理·阿瑞哈特

@charliearehart你低估了我的懒惰,我用的是cat在PowerShell中的别名...更新,包括
KCD

@KCD,嗯。:-)感谢您的澄清。
查理·阿瑞哈特

4

刚刚检查,今天看起来像这样:

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

注意:这是在装有最新版本Docker CE的macOS上,docker-credential-helper-两者都与homebrew一起安装。


3

至少在“ Docker for Windows”中,您可以查看是否通过UI登录到docker hub。只需右键单击Windows通知区域中的docker图标: Docker登录


1
没有GUI的docker版本呢?还是非Windows?
Zameer Fouzan

1
然后,您必须使用其他答案中的一种方法。
BaluJr。

2

如果您想要一个简单的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

1
您可以jq返回正确的退出代码,然后无需进行字符串比较:is_logged_in() { jq -e --arg url ${ADDRESS} '.auths | has($url)' ~/.docker/config.json > /dev/null; }; if is_logged_in; then ...
Guss,

真好!谢谢!
mcw


1

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

0

如@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!
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.