Docker 登录错误:保存凭据失败解决方案
问题描述
在 Ubuntu 20.04 系统中使用 docker login
命令登录 Docker Hub 时,出现以下错误:
Error saving credentials: error storing credentials - err: exit status 1, out: `error getting credentials - err: exit status 1, out:` no usernames for https://index.docker.io/v1/``
这个错误通常与 Docker 的凭据管理配置有关,特别是在 Linux 系统中使用 Docker Desktop 时。
注意
此问题在不同操作系统(Linux、macOS、Windows)上可能有不同的解决方案,但核心原因都与凭据存储配置有关。
解决方案概览
根据不同的操作系统和具体场景,可以尝试以下解决方案:
通用解决方案
# 停止 Docker 服务
service docker stop
# 删除 Docker 配置文件
rm ~/.docker/config.json
# 重启 Docker 服务
service docker start
# 清除现有的 Docker 凭据存储
rm -rf ~/.password-store/docker-credential-helpers
# 生成新的 GPG 密钥对
gpg --generate-key
# 使用生成的 GPG 公钥初始化 pass
pass init <生成的-gpg-id-公钥>
详细解决方案
1. 清除 Docker 配置文件
这是最常见且简单的解决方案,适用于大多数情况:
# 停止 Docker 服务
sudo service docker stop
# 删除配置文件
rm ~/.docker/config.json
# 如果需要,也可以删除凭据帮助程序
rm /usr/local/bin/docker-credential-pass
# 重新启动 Docker 服务
sudo service docker start
然后尝试重新登录 Docker:
docker login
2. 重新配置凭据管理系统
对于 Linux 用户,Docker 使用 pass
工具和 GPG 密钥来管理凭据。如果配置不正确,会导致登录失败:
# 清除现有的凭据存储
rm -rf ~/.password-store/docker-credential-helpers
# 生成新的 GPG 密钥对
gpg --generate-key
# 从 gpg 命令输出中获取公钥 ID
# 示例输出:
# pub rsa3072 2023-06-13 [SC] [expires: 2025-06-12]
# 9F53995439D023FD
# uid [ultimate] Your Name <your.email@example.com>
# sub rsa3072 2023-06-13 [E] [expires: 2025-06-12]
# 使用公钥初始化 pass
pass init 9F53995439D023FD # 替换为你的公钥 ID
重要提示
请确保在生成 GPG 密钥时使用与 Docker Hub 账户关联的电子邮件地址,这有助于避免后续的认证问题。
3. 修改 Docker 配置文件
检查并修改 ~/.docker/config.json
文件中的 credsStore
设置:
// 修改前
{
"auths": {},
"credsStore": "desktop", // 可能导致问题的配置
"currentContext": "desktop-linux"
}
// 修改后(方案1:完全移除 credsStore)
{
"auths": {},
"currentContext": "desktop-linux"
}
// 修改后(方案2:更改 credsStore 值)
{
"auths": {},
"credsStore": "osxkeychain", // 对于 macOS
"currentContext": "desktop-linux"
}
4. 文件权限问题修复
如果遇到权限问题,可以尝试修复 .docker
目录的所有权:
sudo chown -R $(id -u):$(id -g) $HOME/.docker
5. Windows 系统特定解决方案
对于 Windows 用户:
删除可能冲突的凭据帮助程序文件:
- 移除
C:\Program Files\Docker\Docker\resources\bin\docker-credential-desktop.exe
- 移除
C:\Program Files\Docker\Docker\resources\bin\docker-credential-wincred.exe
- 移除
修改
config.json
文件中的credsStore
为wincred
:
{
"auths": {},
"credsStore": "wincred"
}
6. 使用 Personal Access Token 替代密码
如果密码登录持续出现问题,可以尝试使用 Docker Hub 的 Personal Access Token (PAT):
- 在 Docker Hub 网站创建 PAT
- 使用 PAT 替代密码进行登录
7. 检查 GPG 密钥密码问题
如果 GPG 密钥设置了密码,可能会导致 Docker 无法自动访问凭据存储。可以移除 GPG 密钥的密码保护:
# 编辑 GPG 密钥
gpg --edit-key <你的密钥ID>
# 在 GPG 提示符下输入:
passwd
# 输入当前密码后,将新密码留空
# 确认不需要密码保护
安全警告
移除 GPG 密钥的密码会降低安全性,请仅在不包含敏感信息的开发环境中使用此方法。
故障排除步骤
如果上述方案都无效,可以尝试以下完整的故障排除流程:
# 1. 停止 Docker 服务
service docker stop
# 2. 清除所有相关配置
rm ~/.docker/config.json
rm -rf ~/.password-store/docker-credential-helpers
# 3. 重启 Docker
service docker start
# 4. 重新生成 GPG 密钥
gpg --generate-key
# 5. 初始化 pass
pass init <生成的-gpg-id>
# 6. 尝试登录
docker login
总结
Docker 登录错误通常是由凭据管理系统配置问题引起的。通过清除配置文件、重新配置凭据存储或修改 config.json
文件,大多数问题都可以得到解决。如果问题仍然存在,建议检查系统日志或尝试使用 Personal Access Token 进行认证。
最佳实践建议
- 定期更新 Docker 到最新版本
- 备份重要的
.docker/config.json
文件 - 使用强密码和双因素认证保护 Docker Hub 账户
通过以上方法,应该能够解决 Docker 登录时出现的 "Error saving credentials" 错误,恢复正常使用 Docker 服务。