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

rseugnpd  于 2023-02-03  发布在  Docker
关注(0)|答案(7)|浏览(442)

我有一个系统,我试图运行docker login命令,这是一个无头Linux系统,但不幸的是,只有Docker凭据帮助程序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上的“wincrd”和Linux上的“pass”。**一个特殊情况是,在Linux上,如果Docker找不到“pass”二进制文件,则会回退到“secretservice”二进制文件。它以base64编码将凭证(即密码)存储在上述配置文件中。
由于secretservice helper使用GUI凭据存储,它尝试打开一个窗口,这在headless系统上无法实现。
我无法控制系统,因此无法删除/usr/bin/docker-credential-secretservice文件以强制docker login回退到配置文件,而只能使用secretservice帮助程序。
我能做的就是在我的用户的主文件夹中创建和列出文件。我试过这样运行命令:

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

我的印象是login命令会在./docker中创建一个config.json(我注意到docker login会在文件夹不存在的情况下创建该文件夹)。这在没有安装任何helper的系统上有效,但在所讨论的系统上无效。
我也尝试过创建一个~/.docker/config.json,类似于:

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

希望docker login会得到提示,不要对凭据存储使用任何帮助程序。
非管理员是否可以强制docker login回退到:
在上述配置文件中以base64编码存储凭证(即密码)。是否不删除凭证帮助器?
(as顺便说一句,我当然会要求删除/usr/bin/docker-credential-secretservice,但是,如果不可能或供将来参考,是否有其他解决方案?)

weylhg0b

weylhg0b1#

要避免使用credsStore并在Docker配置中存储纯文本身份验证令牌(例如~/.docker/config.json),请从Docker配置文件中删除"credsStore"密钥并重新运行docker login
当您运行docker login时,它会给予警告,但会将auth令牌保存到文件中。

$ 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。

muk1a3rh

muk1a3rh2#

注销当前用户,然后用不同的用户名登录对我很有效。注销删除了保存的Docker凭据。

docker logout <reponame> 
docker login <reponame>
1szpjjfi

1szpjjfi3#

不幸的是,Docker(从18.06开始)首先查找docker-credential-*二进制文件,如果找到其中任何一个,它将自动覆盖~/.docker/config.json中的"credsStore"值。
您唯一的解决方法是在主目录中安装docker-credential-pass,以便Docker使用它而不是docker-credential-secretservicedocker-credential-pass不需要GUI。
安装docker-credential-pass的步骤:
在未安装X11的服务器上Docker登录失败

68bkxrlz

68bkxrlz4#

您可以忽略所有输出,将所有内容发送到/dev/null,如下所示:
echo $TOKEN|docker login -u=user --password-stdin myregistry.com > /dev/null 2>&1
其中$TOKEN是您以前导出的令牌或密码。
在使用某些自动化功能时,这对配置项也很有用

ct3nt3jp

ct3nt3jp5#

我已经浏览了代码,似乎没有办法通常禁用凭据助手的使用。但是您可以跳过每个注册表的代码路径。
https://github.com/docker/cli/blob/25eee83d6b8c475548254b2decc9c8e0490d229c/cli/config/configfile/file.go#L308 将从注册表主机名的credHelpers中查找要使用的helper(docker-credential-后的后缀)。如果它是"",它将使用正常的未加密文件存储。据我所知,这是未记录的,可能是无意的行为。
这样,为了绕过特定注册中心的凭据助手,请执行以下操作

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

我相信{"credsStore":""}不工作的原因是该字段上的omitempty序列化标记,将其设置为空与不设置它是一样的。

2j4z5cfb

2j4z5cfb6#

不是问题的答案,但也许是问题的答案:
我们可以自己启动dbus,然后从cli解锁/锁定/查询keyring。
下面是我使用的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

holgip5t

holgip5t7#

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

相关问题