如何强制“docker login”命令忽略现有凭据帮助程序?

问题描述 投票:0回答:8

我有一个系统,我试图运行

docker login
命令,它是一个无头Linux系统,但不幸的是只安装了Docker Credentials Helper docker-credential-secretservice。

这意味着我收到以下错误:

Error saving credentials: error storing credentials - err: exit status 1, out: `Cannot autolaunch D-Bus without X11 $DISPLAY`

我的理解是这样的:

默认情况下,Docker 会在每个 平台,即 macOS 上的“osxkeychain”、Windows 上的“wincred”,以及 Linux 上的“pass”。 一个特例是,在Linux上,Docker会掉下来 如果找不到“pass”,则返回“secretservice”二进制文件 二进制。如果这些二进制文件都不存在,它将存储 配置文件中采用 Base64 编码的凭据(即密码) 如上所述。

并且由于

secretservice
帮助程序使用 GUI 凭证存储,它会尝试打开一个窗口,而在无头系统上则无法这样做。

我无法控制系统,因此我无法删除

/usr/bin/docker-credential-secretservice
文件来强制
docker login
回退到配置文件,而不是使用
secretservice
帮助程序。

我可以做的是在用户的主文件夹中创建并列出文件。我尝试像这样运行命令:

docker --config ./docker login -u <user-name> -p <password> <repository>

我的印象是登录命令会在 ./docker 中创建一个

config.json
(我注意到
docker login
将创建该文件夹,如果它不存在)。这适用于未安装任何帮助程序的系统,但不适用于有问题的系统。

我还尝试创建一个

~/.docker/config.json
,其中包含以下内容:

echo '{"credStore":""}' > ~/.docker/config.json

希望

docker login
能得到不要使用任何凭证存储助手的提示。

非管理员有没有办法强制

docker login
回退到:

将凭据(即密码)以 Base64 编码存储在上述配置文件中。 不删除凭据助手?

(作为旁注,我当然会要求删除

/usr/bin/docker-credential-secretservice
,但是,如果不可能或供将来参考,是否有任何替代解决方案?)

docker credentials
8个回答
18
投票

在使用不同的用户名登录之前注销当前用户对我有用。注销会删除保存的 docker 凭据。

docker logout <reponame> 
docker login <reponame> 

13
投票

为了避免使用

credsStore
并在 docker 配置中存储纯文本身份验证令牌(例如
~/.docker/config.json
),请从 docker 配置文件中删除
"credsStore"
键并重新运行
docker login

当您运行

docker login
时,它会发出警告,但会将身份验证令牌保存到文件中。

$ docker login
Username: someuser
Password:
WARNING! Your password will be stored unencrypted in ~/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

生成的 docker 配置文件应如下所示:

{
        "auths": {
                "your.docker.registry": {
                        "auth": "dXNlcm5hbWU6cGFzc3dvcmQK="
                }
        }
}

auth
令牌只是一个
username:password
形式的 Base64 编码字符串。

这适用于 Docker 引擎版本 19 和 20。


9
投票

不幸的是,Docker(从 18.06 开始)首先查找

docker-credential-*
二进制文件,如果找到其中任何一个,它将自动覆盖
"credsStore"
中的
~/.docker/config.json
值。

唯一的解决方法是在主目录中安装

docker-credential-pass
,以便 Docker 使用它而不是
docker-credential-secretservice
docker-credential-pass
不需要 GUI。

安装步骤

docker-credential-pass

在未安装 X11 的服务器上 docker 登录失败


3
投票

我查看了代码,似乎没有办法普遍禁用凭证助手的使用。 但是可以跳过每个注册表的代码路径。

https://github.com/docker/cli/blob/25eee83d6b8c475548254b2decc9c8e0490d229c/cli/config/configfile/file.go#L308将在

docker-credential-
中查找要使用的助手(只是
credHelpers
之后的后缀)来自注册表主机名。如果是
""
它将使用普通的未加密文件存储。据我所知,这是没有记录的并且可能是无意的行为。

这样,为了绕过特定注册表的凭据助手,请执行以下操作

mkdir ./docker
echo "{\"credHelpers\": {\"$REGISTRY_HOST\": \"\"}}" > ./docker/config.json
docker --config ./docker login -u $USERNAME -p $PASSWORD $REGISTRY_HOST

我相信

{"credsStore":""}
不起作用的原因是该字段上的
omitempty
序列化标签。设置为空和不设置是一样的


1
投票

您可以通过将所有内容发送到

/dev/null
来忽略所有输出,例如:

echo $TOKEN|docker login -u=user --password-stdin myregistry.com > /dev/null 2>&1

其中
$TOKEN
是您之前导出的令牌或密码。

当使用一些自动化时,这对于 CI 也很有用


1
投票

只需将

~/.docker/config.json
重命名为其他名称,或者如果不再需要它,请将其删除。

mv ~/.docker/config.json ~/.docker/backup-config.json


0
投票

不是问题的答案,但可能是问题的答案:

我们可以自己启动 dbus,然后从 cli 解锁/锁定/查询密钥环。

这些是我使用的 bash 函数:

function unlock-keyring () {
export $(dbus-launch)
read -rsp "Password: " pass
export $(echo -n "$pass" | gnome-keyring-daemon --unlock)
unset pass
}

function lock-keyring () {
dbus-send --dest=org.gnome.keyring --print-reply /org/freedesktop/secrets org.freedesktop.Secret.Service.LockService
}

function query-keyring-locked () {
busctl --user get-property org.freedesktop.secrets /org/freedesktop/secrets/collection/login org.freedesktop.Secret.Collection Locked
}

https://unix.stackexchange.com/questions/473528/how-do-you-enable-the-secret-tool-command-backed-by-gnome-keyring-libsecret-an

https://superuser.com/questions/700826/how-to-lock-a-unlocked-gnome-keyring

https://superuser.com/questions/1618970/query-status-of-gnome-keyring

https://unix.stackexchange.com/questions/602313/unlock-gnome-keyring-daemon-from-command-line


0
投票

这可以避免烦恼:

echo ${DOCKERPW} | docker login -u ${DOCKERUSER} --password-stdin 2> /dev/null
© www.soinside.com 2019 - 2024. All rights reserved.