docker-credential-desktop未安装或未在PATH中可用

86

我可能在我的Mac上安装了一个有些混乱的Docker程序。 起初,我安装了Docker桌面版,但是运行它后,我得知由于我使用的是旧版Mac,所以我必须安装VirtualBox,于是我按照以下步骤进行了安装:

  1. 为用户启用/usr/local/bin文件夹的写入权限

    sudo chown -R $(whoami) /usr/local/bin

  2. 安装Docker-Machine

base=https://github.com/docker/machine/releases/download/v0.16.0 &&
  curl -L $base/docker-machine-$(uname -s)-$(uname -m) >/usr/local/bin/docker-machine &&
  chmod +x /usr/local/bin/docker-machine
  1. 从开发者帐户手动安装Xcode CLI。

  2. 安装Home Brew。

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
  1. 安装Docker和wget(使用Brew)

    brew install docker

    brew install wget

  2. 安装bash自动完成脚本

base=https://raw.githubusercontent.com/docker/machine/v0.16.0
for i in docker-machine-prompt.bash docker-machine-wrapper.bash docker-machine.bash
do
    sudo wget "$base/contrib/completion/bash/${i}" -P /etc/bash_completion.d
done
  1. 启用 docker-machine shell 提示

    echo 'PS1='[\u@\h \W$(__docker_machine_ps1)]\$ '' >> ~/.bashrc

  2. 安装 VirtualBox、ExtensionPack 和 SDK:https://www.virtualbox.org/wiki/Downloads

我现在使用 home-brew 安装了 docker-compose(版本为 1.29.2,构建版本未知),但在运行 docker-compose up 时出现以下错误:

docker.credentials.errors.InitializationError: docker-credential-desktop not installed or not available in PATH

which docker 打印 /usr/local/bin/docker。

Brew 安装文件位于 /usr/local/Cellar/docker/20.10.6/usr/local/Cellar/docker-compose/1.29.2。 我发现还有一个 Homebrew 版本的 docker-machine,那么我应该通过 Homebrew 安装 docker-machine 吗?

我应该检查什么以确保使用 home-brew 的 docker 安装并清除/修正上述步骤中的安装?


1
你能试试这个解决方案吗? - Nick ODell
@NickODell 我试过了,但是没有起作用。不过我找到了问题所在。谢谢。 - Vincenzo
1
你是指 ln -s "/Applications/Docker.app/Contents//Resources/bin/docker-credential-desktop" "/usr/local/bin/docker-credential-desktop" 命令吗?我没有运行这个应用程序。在此之前的帖子实际上说明了正确的 credStore 值取决于 Docker 版本。在我的情况下,是 Docker version 20.10.6, build 370c289 - Vincenzo
同样的问题在WSL2/Ubuntu上出现。对于WSL2的正确解决方案可以在[链接]{https://github.com/docker/for-mac/issues/3785#issuecomment-642210534}中找到(感谢[Nick ODell]{https://stackoverflow.com/users/530160/nick-odell})。下面的所有其他答案都是危险的。 - kingaj
同样的问题在WSL2/Ubuntu上。@NickODell指出了正确的线程。对于WSL2,答案在这个链接中。下面几乎所有的回答似乎都是危险的。 - kingaj
7个回答

233

检查您的~/.docker/config.json并将"credsStore"替换为"credStore"

{
  "stackOrchestrator" : "swarm",
  "experimental" : "disabled",
  "credStore" : "desktop"
}


11
~/.docker/config.json 这是一个精确的文件路径。 - Pavol Travnik
3
这个解决方案在我的 macOS Catalina 上运行良好。 - Carl Winbäck
4
2022年8月。我在Mac Monterey上运行docker Engine 20.10.17,使用colima 0.4.4,没有docker desktop。将"credsStore": "desktop"更改为"credStore": "desktop"帮助我解决了docker登录时出现的以下问题:Error saving credentials: error storing credentials - err: exec: "docker-credential-desktop": executable file not found in $PATH, out: `` - Serdar Dalgic
17
请注意,“credStore”不是一个有效的配置关键字(如果我理解错误,请纠正我),所以将“credsStore”更改为“credStore”能够工作的唯一原因是您实际上删除了“credStore”条目。在我看来,最好的做法是将其删除,或将其重命名为明显的占位符,以便在将来审查配置时不会产生误导。 - Ashley Davies
7
对于使用 Colima 的用户,您可以将 credStore 的值设置为 colima - Jeet Banerjee
显示剩余8条评论

80

在~/.docker/config.json中将credsStore更改为credStore


2
Ivan,如果你查看我的答案(被接受的那个),你会发现它也适用于credsStore..问题在于值..而不是键。 - Vincenzo
这个方法在我的CentOS7上有效。当我运行docker-compose up -d时,我的错误是docker.credentials.errors.InitializationError: docker-credential-pass not installed or not available in PATH。感谢@Ivan。 - skg
1
这也解决了我的问题。在我的情况下,是键是错误的,而不是值。 - Meuko
11
请注意,据我所知,这个解决方案是误导性的:它之所以有效,是因为credStore不是一个有效的密钥,并且被Docker忽略。这相当于删除"credsStore": "desktop",我认为这样做更好,因为如果您将来调试配置文件以确定Docker未解析凭据的原因,可能很容易错过拼写错误。 - Ashley Davies
我也是。@Vicenzo:我尝试了你说的,不对。在我的情况下,关键是credStore。 - jgomo3
这是不正确和危险的。它关闭了凭据存储。 正确答案在此处 - kingaj

33

由于您正在使用Mac,您可以使用docker-credential-osxkeychain代替。

  1. 安装docker-credential-helper

brew install docker-credential-helper
  • 验证docker-credential-osxkeychain是否可用。

  • $ docker-credential-osxkeychain version
    0.6.4
    
  • ~/.docker/config.json中将credsStore设置为osxkeychain

  • {
      "auths": {
        "https://index.docker.io/v1/": {}
      },
      "credsStore": "osxkeychain",
      "experimental": "enabled",
      "stackOrchestrator": "swarm"
    }
    
  • 登录 Docker Hub。

  • $ docker login -u $USER
    Password: 
    Login Succeeded
    

    3
    这是目前为止正确且最安全的答案。在上述内容中,所有答案都绕过了动态凭据。使用docker-credential-osxkeychain的二进制文件可以确保docker登录的凭据不以纯文本格式存储。 - redzack
    这对我有用。我不知道版本检查,但在将我的Docker配置设置为上述第3点提供的内容后,我已经可以运行了。 - Scott
    应该被接受为Mac的最佳答案。 - kingaj
    只安装 docker-credential-helper(即步骤1)使其正常工作。 - y_159
    这是正确的答案。请查看文档https://docs.docker.com/engine/reference/commandline/login/#credential-stores。 - Nardo

    24

    经过长时间的谷歌搜索,我发现问题出在config.json文件上。 以下是错误的"credsStore" : "docker-credential-desktop"

    {
      "credsStore" : "docker-credential-desktop",
      "stackOrchestrator" : "swarm",
      "experimental" : "disabled"
    } 
    

    "credsStore"键的值更改为"desktop",现在compose按预期工作。一些人指出credsDstore拼写错误是问题所在,并通过credDstore进行了修复,但在我的情况下,值是问题所在,它可以使用"credsStore":"desktop""credStore":"desktop"都正常工作。

    希望这能帮助刚开始使用Docker的其他人。 谢谢。


    我正在寻找config.json文件的位置。在我的情况下,它位于~/.docker/config.json。通用文档:https://docs.docker.com/engine/reference/commandline/cli/#docker-cli-configuration-file-configjson-properties - juhoautio
    3
    在 Docker 版本 Docker version 20.10.16, build aa7e414 中,“credsStore:“desktop”是新安装的默认值。 @Ivan 的回答建议将credsStore(复数)更改为credStore(单数)确实解决了我的问题。 - Dan
    这只是关闭了凭据。下面的答案链接是正确的。 - kingaj
    请将英文翻译成中文。只返回翻译后的文本:或者删除整个credStore行。 - undefined

    2
    我在Windows 10上使用wsl2尝试本地调用aws lambda函数时遇到了类似的问题。运行sam build --use-container时,出现了docker.credentials.errors.InitializationError: docker-credential-desktop not installed or not available in PATH的错误。运行which docker-credential-desktop没有结果。
    经过进一步检查,我发现docker-credential-desktop.exe确实在PATH中。通过快速搜索,似乎启用Windows 10 Docker Desktop中的wsl2后端会将wsl/docker-desktop/cli-tools/usr/bin/docker-credentials-desktop.exe链接到/usr/bin/docker-credential-desktop.exe。为了解决这个问题,我简单地删除了符号链接,并创建了一个没有.exe的新链接。
    要检查链接并删除它:
    user@device:~$ ls -l /usr/bin/docker-credential-desktop.exe
    lrwxrwxrwx 1 root root 67 Jan  5 23:15 /usr/bin/docker-credential-desktop.exe -> /wsl/docker-desktop/cli-tools/usr/bin/docker-credential-desktop.exe
    user@device:~$ sudo rm /usr/bin/docker-credential-desktop.exe
    

    要创建一个没有 .exe 后缀的新文件并检查它是否有效:

    user@device:~$ sudo ln -s /wsl/docker-desktop/cli-tools/usr/bin/docker-credential-desktop.exe /usr/bin/docker-credential-desktop
    user@device:~$ ls -l /usr/bin/docker-credential-desktop
    lrwxrwxrwx 1 root root 67 Jan 12 14:22 /usr/bin/docker-credential-desktop -> /wsl/docker-desktop/cli-tools/usr/bin/docker-credential-desktop.exe
    

    之后,我使用.bashrc更新了PATH,问题得到解决。我通过which docker-credential-desktop验证了这一点,现在它显示了符号链接中指定的位置。


    1
    感谢您追踪此问题。只想指出在我的系统上,wsl 挂载在 /mnt/wsl/ 上。可能因人而异。 - Jon Ericson
    谢谢指出 - 我认为/mnt/wsl是默认的挂载位置。我模糊地记得在安装wsl2时更改了我的配置或创建了一个符号链接。 - clayajohnson
    这是不正确的,可能会损坏您的安装。正确答案在第一条评论中由@NickODell发布的链接中。对于WSL,答案在这里 - kingaj

    1
    如果您正在使用WSL,请尝试使用desktop.exe而不是desktop。因为您会发现在/usr/bin/中的程序是docker-credential-desktop.exe
    {
       "credsStore": "desktop.exe"
    }
    

    0
    正如在其他地方提到的那样,将credsStore重命名为credStore只是将其设置为无效值并禁用授权。
    我猜测我的问题是因为我安装了docker-ce而不是docker-desktop。我找到的解决办法是从他们的仓库构建一个凭据助手。
    我在Ubuntu上运行一个无根安装,但是一些命令需要根访问权限,所以最后我运行了:
    • sudo systemctl start docker
    • sudo docker run --privileged --rm tonistiigi/binfmt --install all
    • sudo docker buildx create --use
    • git clone https://github.com/docker/docker-credential-helpers.git
    • cd docker-credential-helpers/
    • make secretservice # secretservice使用dbus secrets manager
    • cp bin/build/docker-credential-secretservice ~/bin # ~/bin在我的$PATH中
    • cd ~/.docker/
    • sed -e 's/"credsStore": "desktop"/"credsStore": "secretservice"/' config.json > config.json.new
    • mv config.json.new config.json

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