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

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

230178 次浏览

编辑2020

回到(关闭) github问题,在这里指出,没有实际的会话或状态;

Docker登录实际上并没有创建任何类型的持久会话,它只是将用户的凭证存储在磁盘上,以便在需要身份验证时读取它们以登录

正如其他人指出的那样,在你成功登录后,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 login <repository>登录docker

$ 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 info中没有显示任何内容。然而,注销命令会告诉你是否登录:

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

(尽管这会迫使你再次登录。)

至少在“Docker for Windows”中,你可以看到你是否通过UI登录到Docker hub。右键单击windows通知区的docker图标: Docker Logged in < / p >

我使用以下两种方法中的一种进行检查:

1:视图配置。json文件:

如果你登录到"private.registry.com",你会在~/.docker/config.json中看到如下相同的条目:

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

2: Try docker login once again:

如果您正在尝试查看private.registry.com是否已经有一个活动会话,请尝试再次登录:

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

如果你得到一个像上面这样的输出,这意味着logged-in-user已经有一个与private.registry.com的活动会话。如果只是提示输入用户名,则表明没有活动会话。

使用如下命令:

docker info | grep 'name'


WARNING: No swap limit support
Username: <strong>jonasm2009</strong>

刚刚检查过,今天看起来是这样的:

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

注意:这是在macOS上安装了最新版本的Docker CE, Docker -credential-helper -两者都安装在自制程序中。

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

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

正如@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!

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"}
在windows上,你可以通过查看这个文件来检查登录“授权”(auths): [USER_HOME_DIR] .docker \ json < / >强

< p >的例子: c: \ \ YOUR_USERANME.docker \用户json < / >强

对于windows凭证,它看起来像这样

{
"auths": {
"HOST_NAME_HERE": {},
"https://index.docker.io/v1/": {}
},
"HttpHeaders": {
"User-Agent": "Docker-Client/18.09.0 (windows)"
},
"credsStore": "wincred",
"stackOrchestrator": "swarm"
}

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

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

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

我的AWS ECR构建脚本有:

ECR_HOSTNAME="${ACCOUNT_ID}.dkr.ecr.${REGION}.amazonaws.com"
TOKEN=$(jq -r '.auths["'$ECR_HOSTNAME'"]["auth"]' ~/.docker/config.json)
curl --fail --header "Authorization: Basic $TOKEN" https://$ECR_HOSTNAME/v2/

如果访问ECR失败,则进行登录:

aws ecr get-login-password --region ${REGION} | docker login --username AWS --password-stdin https://$ECR_HOSTNAME

为此,不能使用适当的Docker凭据存储。默认凭据存储为~/.docker/config.json

在Linux上,如果你通过你的~/.docker/config.json中的credsStore选项启用了secretservice,如下所示:

"credsStore": "secretservice",

那么你将不会在config.json中看到凭据。相反,你需要使用docker-credential-desktop查询凭据,查看下面的答案了解更多细节:

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

下面是一个powershell命令来检查你之前是否登录过注册表,使用其他人提到的文件$HOME/.docker/config.json:

(Get-Content $HOME/.docker/config.json | ConvertFrom-Json).auths.PSobject.Properties.name -Contains "<registry_url>"

这将返回一个True / False布尔值,因此可以如下使用:

if ((Get-Content $HOME/.docker/config.json | ConvertFrom-Json).auths.PSobject.Properties.name -Contains "<registry_url>" ) {
Write-Host Already logged into docker registry
} else {
Write-Host Logging into docker registry
docker login
}

如果你想让它不失败,如果文件不存在,你需要一个额外的检查:

if ( (-Not (Test-Path $HOME/.docker/config.json)) -Or (-Not (Get-Content $HOME/.docker/config.json | ConvertFrom-Json).auths.PSobject.Properties.name -Contains "<registry_url>") )
{
Write-Host Already logged into docker registry
} else {
Write-Host Logging into docker registry
docker login
}

我选择使用-Not语句,因为出于某种原因,当你在一个失败的条件后用-And而不是-Or连接一个命令时,命令会出错。

在Azure容器注册中心(ACR)中,以下工作作为登录检查:

registry="contosoregistry.azurecr.io"
curl -v --header "Authorization: Bearer $access_token" https://$registry/v2/_catalog

如果访问令牌已经过期,将返回HTTP/401。

~/.docker/config.json获取访问令牌的选项,或者使用存储在Docker credStore: echo $registry | docker-credential-desktop get中的刷新令牌从https://$registry/oauth2/token请求访问令牌。

有关刷新令牌和访问令牌的更多信息见ACR integration 文档

上面的许多答案只是关于如何手动检查登录状态。要从命令行执行,可以使用下面的命令。

cat ~/.docker/config.json | jq '.auths["<MY_REGISTRY_HOSTNAME>"]' -e > /dev/null &&  echo "OK" ||  echo "ERR"
  1. 确保您的本地有jq命令。执行jq --version命令进行测试。如果你不能得到一个版本输出,按照下面的说明安装它https://stedolan.github.io/jq/download/

  2. < p >替换& lt; MY_REGISTRY_HOSTNAME>你的注册地址。

  3. 当你运行时,如果你已经成功登录,它将返回OK,否则返回ERR

注意:如果你使用凭据帮助登录(例如,容器注册表的谷歌云认证工具),将.auths关键字替换为.credHelpers