我有一个系统,我试图运行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
,但是,如果不可能或供将来参考,是否有其他解决方案?)
7条答案
按热度按时间weylhg0b1#
要避免使用
credsStore
并在Docker配置中存储纯文本身份验证令牌(例如~/.docker/config.json
),请从Docker配置文件中删除"credsStore"
密钥并重新运行docker login
。当您运行
docker login
时,它会给予警告,但会将auth令牌保存到文件中。生成的Docker配置文件应如下所示:
auth
标记只是username:password
形式的base64编码字符串。这适用于Docker引擎版本19和20。
muk1a3rh2#
注销当前用户,然后用不同的用户名登录对我很有效。注销删除了保存的Docker凭据。
1szpjjfi3#
不幸的是,Docker(从18.06开始)首先查找
docker-credential-*
二进制文件,如果找到其中任何一个,它将自动覆盖~/.docker/config.json
中的"credsStore"
值。您唯一的解决方法是在主目录中安装
docker-credential-pass
,以便Docker使用它而不是docker-credential-secretservice
。docker-credential-pass
不需要GUI。安装
docker-credential-pass
的步骤:在未安装X11的服务器上Docker登录失败
68bkxrlz4#
您可以忽略所有输出,将所有内容发送到
/dev/null
,如下所示:echo $TOKEN|docker login -u=user --password-stdin myregistry.com > /dev/null 2>&1
其中
$TOKEN
是您以前导出的令牌或密码。在使用某些自动化功能时,这对配置项也很有用
ct3nt3jp5#
我已经浏览了代码,似乎没有办法通常禁用凭据助手的使用。但是您可以跳过每个注册表的代码路径。
https://github.com/docker/cli/blob/25eee83d6b8c475548254b2decc9c8e0490d229c/cli/config/configfile/file.go#L308 将从注册表主机名的
credHelpers
中查找要使用的helper(docker-credential-
后的后缀)。如果它是""
,它将使用正常的未加密文件存储。据我所知,这是未记录的,可能是无意的行为。这样,为了绕过特定注册中心的凭据助手,请执行以下操作
我相信
{"credsStore":""}
不工作的原因是该字段上的omitempty
序列化标记,将其设置为空与不设置它是一样的。2j4z5cfb6#
不是问题的答案,但也许是问题的答案:
我们可以自己启动dbus,然后从cli解锁/锁定/查询keyring。
下面是我使用的bash函数:
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
holgip5t7#
只需将
~/.docker/config.json
重命名为其他名称,或者如果不再需要它,则将其删除。mv ~/.docker/config.json ~/.docker/backup-config.json