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

Docker卷绑定空卷或将文件转换为文件夹,docker,docker-volume,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@3aa3

我正在通过发送到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
你好
//运行第二个容器
root@3aa35965846a:/home/node/example#docker run-v/home/node/example/some_volume/:/some_volume/-it节点:10/bin/bash
root@6a84739fbb92:/#ls/一些卷/
*test.txt
root@6a84739fbb92:/#cat/some_volume/test.txt/
cat:/some_volume/test.txt/:是一个目录
第一次运行第二个容器时,卷是空的,如果我尝试直接装入一个文件,它将转换为一个文件夹,然后如果我尝试像上面的示例那样装入文件夹,则只有我先前尝试装入的文件,它是一个文件夹


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

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

docker run -v /etc:/x busybox cat /x/shadow
它将转储主机的加密密码文件,无论您是直接从主机还是从容器运行此命令

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

一般来说,我建议不要将Docker用于主要通过文件系统与外部世界交互的短期流程。将您在另一个容器中运行的任何程序安装到映像的
Dockerfile
,然后直接运行它,而无需通过Docker


如果你真的无法避免这个工作流,我发现唯一可靠的工作就是
docker创建
容器,
docker cp
文件,
docker启动
它,以及
docker等待它完成。完成后,
docker cp
将结果显示在
docker rm
it之前。这是一种艰苦的工作流程,但它解决了两个容器不共享任何文件系统空间的问题。

我必须使用两个容器,那么,有没有更简单的方法在两个容器之间共享文件夹?也许,如果我创建了一个命名卷,我可以用一个容器在其中写入,然后用第二个容器读取?你可以;第一个容器需要知道卷的名称和安装位置。正如我的回答所提示的,如果第一个容器是恶意的,或者存在任何类型的安全问题(例如,许多试图编写脚本的问题都允许微不足道的shell注入攻击),那么就不能阻止它在系统中生根。