如何允许docker sibling容器绑定现有卷

时间:2017-10-25 05:52:36

标签: docker docker-volume

我想知道如何允许“child”(兄弟)docker容器访问已安装卷的某个子目录。作为解释,这是一个简单的设置:

我有以下Dockerfile,它只是在Docker容器中安装Docker:

FROM ubuntu
RUN apt-get update && apt-get install -y curl
RUN curl -fsSL https://get.docker.com/ | sh

我的主机上有以下数据目录

/home/user/data/
                data1.txt
                subdir/
                       data2.txt

构建父图像:

[host]$> docker build -t parent .

然后运行父容器:

[host]$> docker run --rm --name parent -it -v /home/user/data/:/data/ -v /var/run/docker.sock:/var/run/docker.sock parent

现在我有一个正在运行的容器,并且在新容器的“内部”。由于我将docker socket绑定到父级,因此我能够运行docker命令来创建“子”容器,这些容器实际上是兄弟容器。数据卷已成功映射:

[parent]$> ls /data/
subdir   data1.txt

现在我想创建一个只能看到子目录的兄弟容器:

[parent]$> docker run --rm --name child -it -v /data/subdir/:/data/ ubuntu

这会创建一个兄弟容器,我成功地“容纳”了容器,但是新数据目录是空的。我的假设是因为我告诉它使用“/ data /”的卷由主机映射到主机上不存在的目录,而不是使用运行父节点时定义的卷。

[child]$> ls /data/
<nothing>

如何允许此映射工作,以便子进程可以在子目录中创建文件,并且父容器可以查看和访问这些文件?不允许孩子看到data1.txt(或子目录上方的任何其他内容)。

1 个答案:

答案 0 :(得分:1)

“同级”容器是正确的术语,即使您在其中一个容器中运行docker命令,也没有标记“父”和“子”容器之间的直接关系。

安装了docker套接字的容器仍然控制着主机上运行的dockerd,因此通过API发送到dockerd的任何路径都将位于hosts范围内。

docker个命令,使用容器文件系统确实会改变一些事情。这是docker实用程序本身访问本地文件系统时的情况。 docker build docker cp docker import docker exportdocker与本地文件系统交互的示例。

挂载

-v /home/user/data/subdir:/data用于第二个容器

docker run --name parent_volume \
  -it --rm -v /home/user/data:/data ubuntu

docker run --name child_volume \
  -it --rm -v /home/user/data/subdir:/data ubuntu

您运行的进程需要注意写入多个容器中的数据的内容,这样数据就不会被破坏。