我有一个系统,我试图运行
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 凭据。
docker logout <reponame>
docker login <reponame>
为了避免使用
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。
不幸的是,Docker(从 18.06 开始)首先查找
docker-credential-*
二进制文件,如果找到其中任何一个,它将自动覆盖 "credsStore"
中的 ~/.docker/config.json
值。
唯一的解决方法是在主目录中安装
docker-credential-pass
,以便 Docker 使用它而不是 docker-credential-secretservice
。 docker-credential-pass
不需要 GUI。
安装步骤
docker-credential-pass
:
我查看了代码,似乎没有办法普遍禁用凭证助手的使用。 但是您可以跳过每个注册表的代码路径。
docker-credential-
中查找要使用的助手(只是credHelpers
之后的后缀)来自注册表主机名。如果是 ""
它将使用普通的未加密文件存储。据我所知,这是没有记录的并且可能是无意的行为。
这样,为了绕过特定注册表的凭据助手,请执行以下操作
mkdir ./docker
echo "{\"credHelpers\": {\"$REGISTRY_HOST\": \"\"}}" > ./docker/config.json
docker --config ./docker login -u $USERNAME -p $PASSWORD $REGISTRY_HOST
我相信
{"credsStore":""}
不起作用的原因是该字段上的 omitempty
序列化标签。设置为空和不设置是一样的
您可以通过将所有内容发送到
/dev/null
来忽略所有输出,例如:
echo $TOKEN|docker login -u=user --password-stdin myregistry.com > /dev/null 2>&1
$TOKEN
是您之前导出的令牌或密码。
当使用一些自动化时,这对于 CI 也很有用
只需将
~/.docker/config.json
重命名为其他名称,或者如果不再需要它,请将其删除。
mv ~/.docker/config.json ~/.docker/backup-config.json
不是问题的答案,但可能是问题的答案:
我们可以自己启动 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://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
这可以避免烦恼:
echo ${DOCKERPW} | docker login -u ${DOCKERUSER} --password-stdin 2> /dev/null