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

Chr*_*son 10 credentials docker

我有一个尝试运行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`
Run Code Online (Sandbox Code Playgroud)

我认为这是有道理的:

默认情况下,Docker 在每个平台上查找本机二进制文件,即 macOS 上的“osxkeychain”、Windows 上的“wincred”和 Linux 上的“pass”。一个特殊情况是,在 Linux 上,如果 Docker 找不到“pass”二进制文件,它将回退到“secretservice”二进制文件。如果这些二进制文件都不存在,它会将凭据(即密码)以 base64 编码存储在上述配置文件中。

由于secretservicehelper 使用 GUI 凭据存储,因此它会尝试打开一个窗口,而在无头系统上则无法打开该窗口。

我无法控制系统,因此我无法删除/usr/bin/docker-credential-secretservice文件以强制docker login回退到配置文件而不是使用secretservice帮助程序。

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

docker --config ./docker login -u <user-name> -p <password> <repository>
Run Code Online (Sandbox Code Playgroud)

我的印象是登录命令会config.json在 ./docker 中创建一个(我注意到docker login如果文件夹不存在会创建它)。这适用于没有安装任何帮助程序的系统,但不适用于相关系统。

我还尝试使用以下内容创建一个~/.docker/config.json

echo '{"credStore":""}' > ~/.docker/config.json
Run Code Online (Sandbox Code Playgroud)

希望这docker login会得到提示,不要为凭证存储使用任何帮助程序。

有没有办法让非管理员强制docker login回退到:

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

(作为旁注,我当然会要求/usr/bin/docker-credential-secretservice删除,但如果不可能或供将来参考,是否有其他解决方案?)

小智 20

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

docker logout <reponame> 
docker login <reponame> 
Run Code Online (Sandbox Code Playgroud)


wis*_*cky 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 登录失败


小智 6

为避免credsStore在 docker 配置中使用and 存储纯文本身份验证令牌(例如~/.docker/config.json),请"credsStore"从 docker 配置文件中删除密钥并重新运行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
Run Code Online (Sandbox Code Playgroud)

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

{
        "auths": {
                "your.docker.registry": {
                        "auth": "dXNlcm5hbWU6cGFzc3dvcmQK="
                }
        }
}
Run Code Online (Sandbox Code Playgroud)

auth令牌是简单形式的base64编码的字符串username:password

这适用于 Docker Engine 版本 19 和 20。