问题描述
如果想要拉取私有镜像,需要先登录到镜像仓库,这是件相当简单的事情。
但是(凡事走有但是),却会遇到各种问题。比如 Cannot autolaunch D-Bus without X11 $DISPLAY 错误。
该笔记将记录:登录 Docker 镜像仓库的方法,以及常见问题处理。
解决方法
登录镜像仓库的方法很简单:
docker login # 登录 DockerHub 仓库 # 登录私有镜像仓库 docker login http://registry.example.com # 命令行的登录方式 echo "<password>" | docker login --username "<username>" --password-stdin http://registry.example.com
凭证存储方式
在 Docker 中,有很多凭证(在该案例中,指 docker login 凭证)存储的方式。这包括我们已知的:以 base64 编码保存在 ~/.docker/config.json 文件的 auths 字段中。除此之外,还有很多其他存储方式(比如 pass、osxkeychain 等等)。
凭证存储的默认行为
Docker == 调用 ==> Credentials Helper == 调用 ==> External Credentials Store
Credentials Helper:在系统 $PATH 中搜索到的二进制程序。每种操作系统都有与之对应的二进制程序([[https://github.com/docker/docker-credential-helpers/releases|docker-credential-helpers/Release]]),比如 macOS 的 docker-credential-osxkeychain 程序,Windows 的 docker-credential-wincred 程序。
External Credentials Store:后端的凭证存储服务。比如 macOS 的 Apple macOS keychain 服务、Windows 的 Microsoft Windows Credential Manager 服务。Linux 比较特殊,后面将详细说明。
我们以 macOS 为例,在存储凭证时,Docker 调用 docker-credential-osxkeychain(可在 $PATH 中搜索到的二进制程序),然后 docker-credential-osxkeychain 将调用系统的 Apple macOS keychain 来存储凭证。
我们以 Windows 为例,在存储凭证时,Docker 调用 docker-credential-wincred(可在 $PATH 中搜索到的二进制程序),然后 docker-credential-wincred 将调用系统的 Microsoft Windows Credential Manager 来存储凭证。
我们以 Linux 为例,在存储凭证时,Docker 调用 docker-credential-pass(可在 $PATH 中搜索到的二进制程序),然后 docker-credential-pass 将调用系统的 pass 命令来存储凭证。如果 pass 命令不存在,Docker 将使用 docker-credential-secretservice 来调用系统的 D-Bus Secret Service 服务来存储凭证。
当然,还可实现自己的 Credentials Helper 程序,这里就不再说明(因为我们基本用不到),参考 Credentials store/CREDENTIAL HELPER PROTOCOL 文档。
常见问题处理(凭证存储相关)
对于在 Linux 下的,Cannot autolaunch D-Bus without X11 $DISPLAY 问题,有以下几种解决方法:
1)卸载所有的 Credentials Helper 程序,迫使 Docker 使用配置文件存储凭证(Basic Auth);
2)安装对应的 Credentials Helper 程序,比如 Linux 下,安装 pass 命令:apt-get install pass
3)或者,因为 ~/.docker/config.json 使用错误的存储方式,修改 credsStore 配置;
参考文献
docker login | Docker Documentation
Releases · docker/docker-credential-helpers
docker login fails while docker-compose is installed on Ubuntu 18.04 · Issue #6023 · docker/compose
docker login fails on a server with no X11 installed - Stack Overflow
Windows7配置docker配置registry-mirrors国内镜像地址,运行hello-world
Releases · docker/docker-credential-helpers