如何强制执行“docker login”命令以忽略现有的凭据助手?

26

我有一个系统,想要运行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上的“wincred”和Linux上的“pass”。一个特殊情况是,在Linux上,如果找不到“pass”二进制文件,Docker将回退到“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,但如果不可能或者作为参考,是否还有其他解决方案?)
8个回答

19

在用不同的用户名登录之前,先注销当前用户对我很有效。 注销操作会删除保存的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 Engine版本19和20中有效。


如果可以的话,只需删除或重命名 /usr/bin/docker-credential-pass 并在 ~/.docker/config.json 中删除条目。使用 pass 与 docker 太过复杂且容易出错。 - user855443
删除credStore字段对我有用。在登录时删除credstore后,它显示了警告并将授权令牌保存为base64格式的配置文件中。只是一个建议:使用docker --config选项在除实际~/.docker/config.json之外的某些位置使用配置文件,可以更轻松地执行这些混乱的操作,而不必担心弄坏实际的配置文件。 - George Pantazes

9
很遗憾,Docker(截至18.06版本)首先查找docker-credential-*二进制文件,如果找到任何一个,则会自动覆盖~/.docker/config.json中的"credsStore"值。
你唯一的解决方法是在你的主目录下安装docker-credential-pass,这样Docker将使用它而不是docker-credential-secretservicedocker-credential-pass不需要GUI。
安装docker-credential-pass的步骤:

docker登录失败,因为服务器上没有安装X11


1
https://github.com/docker/docker-credential-helpers 提到了 pass,但没有解释 pass 是什么。pass 是标准的 Unix 密码管理器。 - cowlinator
在Windows上,如果找不到默认的docker-credential-winpass助手程序,它会直接失败并显示错误信息,而不会回退到其他任何东西,因此您不能仅删除默认助手程序,而必须定义一个替代品。 - StampyCode

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序列化标记。将其设置为空与不设置相同。

WFM,Docker桌面版4.17。我将以下内容添加到我的config.json文件中:"credHelpers": { "artifactory.example.com": "", "docker.io": "" } - Marvin

2

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

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


1

虽然不是问题的答案,但或许能解决问题:

我们可以自己启动 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


0

你可以通过将所有输出发送到/dev/null来忽略它们,例如:

echo $TOKEN|docker login -u=user --password-stdin myregistry.com > /dev/null 2>&1
其中$TOKEN是之前导出的令牌或密码。

当使用一些自动化工具时,这也会非常有用。


-1
这样做就可以避免烦人的提醒了。
echo ${DOCKERPW} | docker login -u ${DOCKERUSER} --password-stdin 2> /dev/null

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接