Docker卷绑定空卷或将文件转换为文件夹

时间:2019-08-24 09:49:03

标签: docker docker-volume

我正在通过发送到docker daemon来运行容器,以便它可以运行同级容器,并且在该容器中,我尝试运行另一个容器并装入一个卷以访问某些数据,但是在同级容器中,该卷是空或文件已转换为文件夹...

运行第一个容器:

$ docker run -v /var/run/docker.sock:/var/run/docker.sock -it example /bin/bash

root@3aa35965846a:/home/node/example# ls some_volume/ 
test.txt
root@3aa35965846a:/home/node/example# cat some_volume/test.txt 
hello


// Running the second container
root@3aa35965846a:/home/node/example# docker run -v /home/node/example/some_volume/:/some_volume/ -it node:10 /bin/bash

root@6a84739fbb92:/# ls /some_volume/
*  test.txt
root@6a84739fbb92:/# cat /some_volume/test.txt/
cat: /some_volume/test.txt/: Is a directory

第一次运行第二个容器时,该卷为空,如果我尝试直接安装文件,则该卷将转换为文件夹,此后,如果像上面的示例那样尝试安装该文件夹,则只有一个我曾尝试挂载的文件,它是一个文件夹。

这怎么可能?如果我尝试在第一个容器外部安装卷,那么我没有任何问题,该如何解决?

1 个答案:

答案 0 :(得分:1)

docker run -v选项中的第一个路径始终在主机系统上。例如,如果您

docker run -v /etc:/x busybox cat /x/shadow

它会转储主机的加密密码文件,无论您是直接从主机还是从容器运行此命令。

无法将一个目录从一个容器共享到另一个容器。如果启动容器知道有关其自身目录结构的信息(特别是从特定主机路径或命名卷挂载了某个目录),则它可以将其复制到另一个容器,但这不是通用的答案。您看到的其他行为仅仅是主机系统上不存在这些目录的结果。

通常,我建议不要使用Docker进行短暂存在的进程,这些进程主要通过文件系统与外界交互。采取您要在其他容器中运行的任何程序,将其安装在映像的Dockerfile中,然后直接运行它,而无需通过Docker。

如果您确实无法避免此工作流程,那么我发现可靠的唯一工作就是docker create容器,docker cp个文件,docker start它和{ {1}}完成。完成后,docker wait的结果先于docker cp。这是一种艰苦的工作流程,但是它解决了两个容器不共享任何文件系统空间的问题。