在未安装X11的服务器上,Docker登录失败

94

我正在尝试使用私有 docker 注册表部署带镜像的 docker 配置。

现在,每次我执行 docker login registry.example.com 命令时,都会得到以下错误信息:

error getting credentials - err: exit status 1, out: Cannot autolaunch D-Bus without X11 $DISPLAY

我在 Ubuntu Server 上运行,并尝试了 Ubuntu Docker 包和 Docker-CE 包。

如何在没有X11会话的情况下登录?


1
删除您的docker-compose文件,它应该能正常工作。这似乎是一个bug: https://github.com/docker/compose/issues/6023 - lvthillo
你应该将ChrisWue的回答视为正确的。 - Anderson Lira
7个回答

153

看起来这是因为默认使用secretservice可执行文件,因为某些原因似乎存在一些X11依赖关系。如果您安装并配置pass,则docker将使用它来解决问题。

简而言之(来自https://github.com/docker/compose/issues/6023

sudo apt install gnupg2 pass 
gpg2 --full-generate-key

这将为您生成一个gpg2密钥。完成后,您可以使用以下命令列出它:

gpg2 -k

复制密钥 ID(标记为[uid]的行中)并执行

pass init "whatever key id you have"

现在,docker login应该可以正常工作了。

关于此问题,Launchpad上记录了几个错误:

https://bugs.launchpad.net/ubuntu/+source/golang-github-docker-docker-credential-helpers/+bug/1794307

https://bugs.launchpad.net/ubuntu/+source/docker-compose/+bug/1796119


3
谢谢您的回复。我已经更换到Debian系统,它的使用方式与我的Arch开发机器相同,因此很遗憾我无法测试您的解决方案。 - msrd0
1
这个解决方案在Ubuntu18.04上给了我一个警告:“警告!您的密码将以未加密的形式存储在/home/adwised/.docker/config.json中。” - Phoenix
@MohammadMasoumi 如果 pass 没有正确安装或者您的 Docker 安装无法找到它,请检查一下。 - ChrisWue
2
对我来说(在Ubuntu 18.04上),指令“从标记为[uid]的行”是不正确的,相反需要查找标记为pub的条目中的ID。(但答案仍然有帮助,这只是一个提示,以防其他人使用时遇到相同的问题) - Daryn
这个 from the line labelled [uid]) 是什么意思? - Sutra
显示剩余6条评论

112
这个可以用: sudo apt remove golang-docker-credential-helpers

10
这个方法可行,可以让你登录,但你的密码会以未加密的方式保存。Docker 给出了警告:警告!你的密码将以未加密的方式存储在 $HOME/.docker/config.json 文件中。 - Azeirah
1
这个 docker login 失败显然是一个已知问题,归因于 golang-docker-credential-helpers Ubuntu 包。这个答案确实可以让你在没有 GUI 的情况下进行 docker login,但正如 @tmuecksch 所提到的,之后你将不得不重新安装 docker-compose(以及 golang... 包,如果你需要它)。正如 @Azeirah 所提到的,我确实收到了一个警告,指出 my password will be stored unencrypted in ...,但实际上它并没有被存储在任何我能找到的地方。 - travisw
7
已解决问题,但同时卸载了 docker-compose - Jakob Drachmann Havtorn
1
真正的问题是,如何在不卸载任何东西的情况下获得旧行为(在xyz中存储未加密的数据)。 - Marandil
1
@RicHincapie: 尝试使用base64解码它 :-) grep '"auth"' /root/.docker/config.json | cut -d'"' -f4 | base64 -d - undefined
显示剩余3条评论

38

您可以删除有问题的包golang-docker-credential-helpers,而不必删除所有的docker-compose

以下方法适用于我在没有安装X11的服务器上:

dpkg -r --ignore-depends=golang-docker-credential-helpers golang-docker-credential-helpers

然后

echo 'foo' | docker login mydockerrepo.com -u dockeruser --password-stdin

来源:

Debian中报告的漏洞: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=910823#39
Ubuntu中报告的漏洞: https://bugs.launchpad.net/ubuntu/+source/docker-compose/+bug/1796119


这对我有效,但是在未来更新的情况下,有没有重新自动安装软件包的风险? - ncarrier
版本:23.0.2下为我工作。 - Tiana987642

28

secretservice需要GUI界面。您可以在没有GUI的情况下使用pass

不幸的是,Docker关于如何配置Docker凭证助手的文档相当缺乏。以下是一个全面的指南,介绍如何在Docker中配置pass(在Ubuntu 18.04上测试通过):

1. 安装用于pass的Docker凭证助手

# substitute with the latest version
url=https://github.com/docker/docker-credential-helpers/releases/download/v0.6.2/docker-credential-pass-v0.6.2-amd64.tar.gz

# download and untar the binary
wget $url
tar -xzvf $(basename $url)

# move the binary to a dir in your $PATH
sudo mv docker-credential-pass /usr/local/bin

# verify it works
docker-credential-pass list

2. 安装和配置pass

apt install pass

# create a gpg2 key
gpg2 --gen-key
# if you have issues with lack of entropy, "apt install haveged" and try again

# create the password store using the gpg user id above
pass init $gpg_id

3. Docker登录

docker login

# You should not see any credentials stored in "auths" section.
# "credsStore": "pass" should have been automatically added.
# If the value is "secretservice", replace it with "pass".
cat ~/.docker/config.json

# verify credentials stored in `pass` store now
pass

17

已经有其他的答案了,但我找到了一种比较简单的方法,是在 https://github.com/docker/docker-credential-helpers/issues/105 的评论中发现的。

解决方法是将 docker-credential-secretservice 重命名即可,例如: mv /usr/bin/docker-credential-secretservice /usr/bin/docker-credential-secretservice.broken

一旦你这样做了,无论是否安装了 docker-compose,docker 登录都可以正常工作,没有其他的包添加或删除是必要的。


尝试过了,但现在出现了“保存凭据错误:存储凭据错误 - 错误:exec:“docker-credential-secretservice”:在$ PATH中找不到可执行文件,输出:```”。 - Stephen Kuehl
使用 AWS CLI 对我有效。我正在使用安装了 Docker 的映像启动的 EC2 服务器。每次启动新实例时,我都必须这样做,否则无法通过 AWS CLI 进行身份验证。谢谢。 - robscodebase
在 GCP 实例上对我有用。 - Panfeng Li
非常感谢你! - Nathan Lima
谢谢!在我的脚本中,我按照您的建议移动它,进行Docker登录,然后将其移回。 - Jay

3

在Ubuntu 18.04上对我有帮助的是:

  1. 按照@oberstet贴子中的步骤卸载golang helper。
  2. 在卸载helper后进行登录。
  3. 通过 sudo apt-get install docker 重新安装docker。
  4. 通过 sudo docker login 再次登录。

3

2
软件包管理器的存在是Linux相对于其他操作系统的巨大优势。通常情况下,您不希望在没有发行版软件包管理器的意识下安装软件,例如仅通过下载软件并将其复制到/usr/bin或类似位置。一个非常明显的原因是您可以通过一个命令更新所有软件,另一个原因是您可以依赖其他软件包。 - msrd0
1
我通过从我的系统中移除Ubuntu并使用能够运行Docker的系统来解决了这个问题(我在稳定环境下使用Debian,在暂存环境下使用Fedora)。 - msrd0
@msrd0 软件包系统引入的软件隔离不足是Linux的一个巨大劣势,也是像Docker这样的“黑科技”存在的原因。回到主题:这个问题是在Ubuntu软件包中引入的,抹掉Ubuntu并不是解决方案,那么你有什么解决方法建议? - Oleg Neumyvakin
是的,您说得完全正确。像 Fedora 这样的一些发行版提供了 SELinux,但无法替代 Docker 所做的隔离工作。我问这个问题是希望能找到一个可接受的解决方法(例如更改配置文件或类似的方法,而不是“禁用”包管理器),但我没有找到,所以删除 Ubuntu 对我来说是唯一可能的结果。 - msrd0
Docker的好处在于你可以有一个docker-compose.yml,将其复制到安装了docker的不同操作系统中,再复制带有所有docker卷的目录,你将不会注意到与之前操作系统的任何区别。 - msrd0
对于那些不关心及时更新的人来说,这是一个不错的快速解决方案。 - Seyed Ali Roshan

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