Skip to content

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)上可能有不同的解决方案,但核心原因都与凭据存储配置有关。

解决方案概览

根据不同的操作系统和具体场景,可以尝试以下解决方案:

通用解决方案

bash
# 停止 Docker 服务
service docker stop

# 删除 Docker 配置文件
rm ~/.docker/config.json

# 重启 Docker 服务
service docker start
bash
# 清除现有的 Docker 凭据存储
rm -rf ~/.password-store/docker-credential-helpers

# 生成新的 GPG 密钥对
gpg --generate-key

# 使用生成的 GPG 公钥初始化 pass
pass init <生成的-gpg-id-公>

详细解决方案

1. 清除 Docker 配置文件

这是最常见且简单的解决方案,适用于大多数情况:

bash
# 停止 Docker 服务
sudo service docker stop

# 删除配置文件
rm ~/.docker/config.json

# 如果需要,也可以删除凭据帮助程序
rm /usr/local/bin/docker-credential-pass

# 重新启动 Docker 服务
sudo service docker start

然后尝试重新登录 Docker:

bash
docker login

2. 重新配置凭据管理系统

对于 Linux 用户,Docker 使用 pass 工具和 GPG 密钥来管理凭据。如果配置不正确,会导致登录失败:

bash
# 清除现有的凭据存储
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 设置:

json
// 修改前
{
  "auths": {},
  "credsStore": "desktop", // 可能导致问题的配置
  "currentContext": "desktop-linux"
}

// 修改后(方案1:完全移除 credsStore)
{
  "auths": {},
  "currentContext": "desktop-linux"
}

// 修改后(方案2:更改 credsStore 值)
{
  "auths": {},
  "credsStore": "osxkeychain", // 对于 macOS
  "currentContext": "desktop-linux"
}

4. 文件权限问题修复

如果遇到权限问题,可以尝试修复 .docker 目录的所有权:

bash
sudo chown -R $(id -u):$(id -g) $HOME/.docker

5. Windows 系统特定解决方案

对于 Windows 用户:

  1. 删除可能冲突的凭据帮助程序文件:

    • 移除 C:\Program Files\Docker\Docker\resources\bin\docker-credential-desktop.exe
    • 移除 C:\Program Files\Docker\Docker\resources\bin\docker-credential-wincred.exe
  2. 修改 config.json 文件中的 credsStorewincred

json
{
  "auths": {},
  "credsStore": "wincred"
}

6. 使用 Personal Access Token 替代密码

如果密码登录持续出现问题,可以尝试使用 Docker Hub 的 Personal Access Token (PAT):

  1. 在 Docker Hub 网站创建 PAT
  2. 使用 PAT 替代密码进行登录

7. 检查 GPG 密钥密码问题

如果 GPG 密钥设置了密码,可能会导致 Docker 无法自动访问凭据存储。可以移除 GPG 密钥的密码保护:

bash
# 编辑 GPG 密钥
gpg --edit-key <你的密钥ID>

# 在 GPG 提示符下输入:
passwd

# 输入当前密码后,将新密码留空
# 确认不需要密码保护

安全警告

移除 GPG 密钥的密码会降低安全性,请仅在不包含敏感信息的开发环境中使用此方法。

故障排除步骤

如果上述方案都无效,可以尝试以下完整的故障排除流程:

bash
# 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 服务。