Bash 在 WSL 上找不到 docker(或任何命令),即使它在路径中

Bash on WSL cannot find docker (or any command) even though it is in the path

我正在尝试使用 WSL1 在 Windows 上执行 bash 脚本。此脚本包含对命令的调用,如下所示:

script.sh:

echo $PATH
docker --version

在使用 bash script.sh 从命令行执行后,它 returns PATH,其中包括 Windows 路径,包括此 Docker 路径:

/mnt/host/c/Program Files/Docker/Docker/resources/bin

然后 returns command not found.

我确实安装了 Docker 桌面版。

Windows PATH 中的任何其他命令也会发生这种情况。我想我不知道如何将 Windows 路径整合到 bash?

任何人都可以帮助我知道我做错了什么吗?

简短回答,尝试 docker.exe --version,但请注意下面“详细信息”部分中的注意事项。


详情:

总结一下:

  • 你在 WSL1
  • 您在 Windows
  • 中安装了 Docker 桌面
  • 您的 $PATH 显示目录 /mnt/host/c/Program Files/Docker/Docker/resources/bin 在 WSL 搜索路径中。
  • 尝试执行 docker --version(或路径上的任何其他 Windows 命令)失败并返回 command not found

正如您所知,WSL(版本 1 和 2)的互操作特性:

  • 将 Windows 路径附加到您的 Linux 路径
  • 允许执行 Windows 个二进制文件

然而,Linux 没有“文件扩展名”的概念来确定某物是否可执行。在 Linux 下,您确实需要键入完整的文件名,包括 .exe 扩展名,以便它执行。


注意事项

一般来说,请记住 Windows 命令 需要您提供 Windows 路径.例如,运行ning notepad.exe ~/myfile 不会起作用,因为 Windows 没有 ~ 的概念,甚至 /home/<yourusername> 或任何其他 Linux路径。对于 Windows,这将类似于 \\wsl$\<distroname>\home\<yourusername>\myfile。 (旁注:无论如何不要使用记事本创建 Linux 文件——行结尾将是 DOS/Windows 而不是 Unix/Linux。)

对于 Docker,请特别注意,您仍然需要 运行 Docker 引擎本身 某处 。这可以是:

  • Docker Desktop 创建和管理的 WSL2 实例(默认,推荐)
  • A Hyper-V 虚拟机(“旧方法”)
  • 您通过 DOCKER_HOST 环境变量指向的远程 Docker 守护程序

无论如何,我不清楚您为什么要从 WSL1 尝试此操作,因为您仍然需要 Windows 系统支持虚拟化才能使用前两种方法中的任何一种。

对于第三个选项,指向远程主机,您将 运行 陷入一个问题,因为 Windows' 可执行文件不能(通常)获取 Linux 环境变量。如果需要,您需要查看 WSLENV 才能处理此问题。

一般来说,虽然您将能够 docker.exe --version 在 WSL1 中工作,但请注意您可能会 运行 遇到更复杂场景的其他问题。

它比 WSL2 中的 运行 docker 更受欢迎。 Docker Desktop 会自动 link 一个 docker(不是 docker.exe)到你的 WSL2 发行版中,这将与 Linux-side 的东西完全兼容。