单个文件卷挂载为 Docker 中的目录

新手上路,请多包涵

Docker 文档 说可以将单个文件挂载到 Docker 容器中:

-v 标志也可用于从主机挂载单个文件——而不仅仅是目录。

$ docker run --rm -it -v ~/.bash_history:/.bash_history ubuntu /bin/bash

这会将您放入新容器中的 bash shell,您将从主机获得 bash 历史记录,当您退出容器时,主机将获得在容器中键入的命令的历史记录。

但是当我尝试时,文件作为目录安装:

 tom@u ~/project $ docker run --rm -it -v file.json:/file.json test
total 80K
drwxr-xr-x  9 root root 4.0K Dec  7 12:58 .
drwxr-xr-x 63 root root 4.0K Dec  7 12:58 ..
drwxr-xr-x  2 root root 4.0K Dec  4 16:10 file.json

我的 Dockerfile 看起来像这样:

 FROM ubuntu:14.04
MAINTAINER Tom
CMD ["ls", "-lah", "/test"]

Docker 版本为 1.9.1,构建 a34a1d5。

这是文档问题,是我的误解,还是发生了其他事情?

原文由 TTT 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 641
2 个回答

test 是您使用“ docker build -t test ”构建的图像的名称,而不是 /test 文件夹。

尝试 Dockerfile

 CMD ["ls", "-lah", "/"]
or
CMD ["cat", "/file.json"]

和:

 docker run --rm -it -v $(pwd)/file.json:/file.json test

请注意使用 $(pwd) 以使用其完整绝对路径安装文件(不支持相对路径)

通过使用 $(pwd) ,您将获得一个确实存在的绝对路径,并尊重大小写,而不是可能不存在的文件名或路径。

不存在的主机路径将作为文件夹安装在容器中。

原文由 VonC 发布,翻译遵循 CC BY-SA 4.0 许可协议

也许上面的答案很清楚……但我花了一些时间才弄清楚我的情况。

导致与 -v 共享的文件显示为目录而不是文件的根本原因是 Docker 在主机上找不到该文件。因此 Docker 在容器中创建了一个新目录,其名称是主机上不存在的文件的名称,因为 docker 认为用户只想共享将来创建的卷/目录。

所以在上面报告的问题中,如果你在 -v 命令中使用了相对目录并且 docker 不理解相对目录,这意味着在主机上没有找到该文件,因此 docker 创建了一个目录。当问题是由于相对目录引起的时,上面建议使用 $(pwd) 的答案将是正确的解决方案。

但是对于那些没有使用相对目录并且遇到相同问题的人阅读此页面……然后尝试了解主机上缺少文件的原因。

这可能只是一个愚蠢的错字…

可能是您正在从客户端运行“docker run”命令,该命令在不同的主机上生成 docker 容器,并且共享的文件在该不同的主机上不存在。与 -v 共享的文件必须存在于 docker 代理将生成容器的主机上……不一定在执行“docker run -v …”命令的客户端上(尽管它们在很多情况)。

对于 Mac 和 Windows,上面还有其他可能的解释……也可能是这样。

因此,主机中缺少的文件是问题…解决设置中的问题…使用 $(pwd) 可能是解决方案,但并非总是如此。

原文由 Nikopol 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题