Docker工具箱:守护程序的错误响应:无效模式:/root/Docker

wixjitnu  于 2023-03-17  发布在  Docker
关注(0)|答案(7)|浏览(137)

我是一个Docker新手,目前正在复制课程视频。我必须补充的是,我只有Windows 10 Home,因此我仅限于Docker工具箱。(在工作中,我有W 10 Pro,使用Docker本身,没有遇到我即将报告的问题)。
当我在Windows Power Shell中运行以下命令时:

PS C:\Program Files\Docker Toolbox> docker run -ti -h python -v ${pwd}:/root/docker -p 9999:9999 ubuntu:latest /bin/bash

我收到以下错误

C:\Program Files\Docker Toolbox\docker.exe: Error response from daemon: invalid mode: /root/docker.
   See 'C:\Program Files\Docker Toolbox\docker.exe run --help'.

问题不是发生在命令提示符下,所以看起来和电源 shell 有关。我在讨论板上没有找到任何东西。任何输入都将不胜感激。
最佳马库斯

piah890a

piah890a1#

我在使用Docker工具箱时遇到了同样的问题。在源路径和目标路径之前再使用一个“/”可以解决这个问题。在您的情况下,它看起来像这样:

docker run -ti -h python -v /${pwd}://root/docker -p 9999:9999 ubuntu:latest /bin/bash

如果这样做不起作用,请尝试使用绝对路径和额外“/”,如下所示:

docker run -ti -h python -v //c/path_to_application://root/docker -p 9999:9999 ubuntu:latest /bin/bash
r55awzrz

r55awzrz2#

“无效模式”错误来自解析卷装载中的第三个字段,其中每个字段都用冒号分隔。在此命令中:

docker run -ti -h python -v ${pwd}:/root/docker -p 9999:9999 ubuntu:latest /bin/bash

${pwd}将扩展为类似c:\Program Files\...的内容,这意味着卷挂载将被解析为:

  • source:C(或您当前的驱动器号,这将作为命名卷而不是主机路径进行处理)
  • 目标:/Program Files/...或您碰巧从中运行此命令的任何位置。
  • 装载选项:/root/,这是一种“无效模式”(正常选项包括ro等用于只读装载的选项)

您需要在驱动器号之前添加一个前导斜杠,并删除驱动器号之后多余的冒号。使用PowerShell时,您可能被迫手动展开路径,而不使用${pwd}

docker run -ti -h python -v "/c/Program Files/...:/root/docker" -p 9999:9999 ubuntu:latest /bin/bash

如果你使用git bash,它有一个独特的功能,可以将带有正斜杠的内容转换成安装目录下的相对路径。要禁用这个功能,你可以切换到第二个斜杠:

docker run -ti -h python -v "/$(pwd):/root/docker" -p 9999:9999 ubuntu:latest //bin/bash

注意,在这两个例子中,我都引用了路径,以防包含空格。

jchrr9hc

jchrr9hc3#

结果表明Docker Toolbox需要一种不同的方法,如本文所述
Docker Forums: Map Windows Directory to Docker Container
正如他们所说,
在Windows上,你不能直接将Windows目录Map到你的容器。因为你的容器驻留在VirtualBox VM中。所以你的docker -v命令实际上是在VM和容器之间Map目录。
所以你得分两步来做:
通过VirtualBox管理器将Windows目录Map到虚拟机将容器中的目录Map到虚拟机中的目录您最好使用Kitematic UI来帮助您,这样会更容易。

  • 我首先在VirtualBox上为我使用的机器定义了一个共享文件夹。
  • 然后关闭机器和Docker窗口,然后再次启动Docker工具箱。
  • 然后运行docker-machine ssh default,并将目录更改为您共享的文件夹(使用给定名称)。我的是“cd mydocker”,然后使用ls可以看到您与VM共享的文件。
  • 在工具箱中,运行docker run -it -v /mydocker:/容器图像名称中的路径/bin/sh
  • 您应该在/path_in_container中看到该文件夹和内容。
h9vpoimq

h9vpoimq4#

我建议你在Windows中使用绝对路径,类似于:

docker run -ti -h python -v /c/path_to_application:/root/docker -p 9999:9999 ubuntu:latest /bin/bash

添加/c/then_remaining_part_to_your_app,注意/c/是驱动器。

pxyaymoc

pxyaymoc5#

我也有同样的问题与Docker和我的解决方案是部分解决了上面的答案之一,说使用一个/之前的PWD命令。
然而,带花括号的/${pwd}Git Bash中给我一个错误的输出,所以这个问题的答案是使用/$(pwd)
Docker的最终答案是:

docker run --rm -v "/$(pwd)/function":/var/task:ro,delegated -v "/$(pwd)/layer":/opt:ro,delegated lambci/lambda:python3.8 Main.lambda_handler '{"someVar": "someValue", "var2": "value2"}'
xeufq47z

xeufq47z6#

其他的答案非常有用。只是想补充一些我在研究这个问题时学到的东西。这是关于gitbash for windows在幕后所做的POSIX-Windows文件路径转换。它与冒号变成分号以匹配PATH分隔符有关。它更好地解释了here。似乎当你进行转义时,你需要匹配其他答案中所述的卷挂载。无论如何,希望这也能帮助其他人。

ubbxdtey

ubbxdtey7#

您看到的错误消息表明您用于Docker卷装载的路径不是绝对路径。
要解决此问题,您可以将${pwd}替换为本地目录的绝对路径。以下是在Windows上查找绝对路径的方法:
1.使用cd命令导航到要用于Docker卷装载的目录。
1.键入echo %cd%并按Enter键,这将打印当前目录的绝对路径。
1.现在,您可以将Docker run命令中的${pwd}替换为刚才找到的绝对路径,并用引号括起来。
docker run -it -h python -v "%cd%":/root/docker -p 9999:9999 ubuntu:latest /bin/bash

相关问题