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

Docker volume bind empty volume or convert files to folders

我通过发送到 docker 守护进程来 运行 连接一个容器,这样它就可以 运行 一个同级容器,在那个容器中我尝试 运行 另一个容器并安装一个卷以访问一些数据,但是在同级容器中,该卷为空或文件已转换为文件夹...

运行第一个容器:

$ 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

我第一次 运行 第二个容器的卷是空的,如果我尝试直接挂载文件,它会转换为文件夹,然后如果我尝试像示例一样挂载文件夹上面只有我之前尝试挂载的文件,是一个文件夹

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

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

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

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

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

一般来说,我会建议 不要 使用 Docker 用于主要通过文件系统与外界交互的短期进程。在另一个容器中使用任何你想要 运行 的程序,将它安装在你的图像的 Dockerfile 中,然后 运行 直接安装它而不需要通过 Docker.

如果你真的无法避免这个工作流程,我发现唯一可靠的工作是 docker create 容器,docker cp 文件,docker start 它,和 docker wait 让它完成。完成后,docker cp 结果先于 docker rm 输出。这是一种艰苦的工作流程,但它解决了两个容器不共享任何文件系统的问题space。