如何允许 docker 兄弟容器从现有卷绑定子目录
How to allow docker sibling container to bind subdirectory from existing volume
我想知道如何允许 "child"(兄弟)docker 容器访问已安装卷的某些子目录。作为解释,这是一个简单的设置:
我有以下 Docker 文件,它只是将 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
构建 parent 图像:
[host]$> docker build -t parent .
然后 运行 parent 容器:
[host]$> docker run --rm --name parent -it -v /home/user/data/:/data/ -v /var/run/docker.sock:/var/run/docker.sock parent
现在我有一个 运行ning 容器,并且是 "inside" 新容器。由于我将 docker 套接字绑定到 parent,因此我能够 运行 docker 命令创建 "child" 容器,它们实际上是同级容器。数据卷映射成功:
[parent]$> ls /data/
subdir data1.txt
现在我想创建一个只能看到subdir目录的兄弟容器:
[parent]$> docker run --rm --name child -it -v /data/subdir/:/data/ ubuntu
这创建了一个兄弟容器,我成功地 "inside" 容器,但是新的数据目录是空的。我的假设是因为我告诉它使用“/data/”的卷被主机映射到主机上不存在的目录,而不是使用 运行 宁 [=48] 时定义的卷=].
[child]$> ls /data/
<nothing>
我该怎么做才能使此映射起作用,以便 child 可以在子目录中创建文件,并且 parent 容器可以查看和访问这些文件? child 不允许看到 data1.txt(或子目录之上的任何其他内容)。
"Sibling" 容器是正确的术语,您标记的 "parent" 和 "child" 容器之间没有直接关系,即使您 运行 docker
命令在其中一个容器中。
安装了 docker 套接字的容器仍然控制主机上的 dockerd
运行ning,因此通过 [=37= 发送到 dockerd
的任何路径] 将在主机范围内。
有 docker
命令使用容器文件系统确实改变了一些事情。这是 docker
实用程序本身正在访问本地文件系统的时候。 docker build
docker cp
docker import
docker export
是 docker
与本地文件系统交互的示例。
坐骑
第二个容器使用-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
您 运行 的进程需要注意写入装载到多个容器中的数据的内容,以免数据被破坏。
我想知道如何允许 "child"(兄弟)docker 容器访问已安装卷的某些子目录。作为解释,这是一个简单的设置:
我有以下 Docker 文件,它只是将 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
构建 parent 图像:
[host]$> docker build -t parent .
然后 运行 parent 容器:
[host]$> docker run --rm --name parent -it -v /home/user/data/:/data/ -v /var/run/docker.sock:/var/run/docker.sock parent
现在我有一个 运行ning 容器,并且是 "inside" 新容器。由于我将 docker 套接字绑定到 parent,因此我能够 运行 docker 命令创建 "child" 容器,它们实际上是同级容器。数据卷映射成功:
[parent]$> ls /data/
subdir data1.txt
现在我想创建一个只能看到subdir目录的兄弟容器:
[parent]$> docker run --rm --name child -it -v /data/subdir/:/data/ ubuntu
这创建了一个兄弟容器,我成功地 "inside" 容器,但是新的数据目录是空的。我的假设是因为我告诉它使用“/data/”的卷被主机映射到主机上不存在的目录,而不是使用 运行 宁 [=48] 时定义的卷=].
[child]$> ls /data/
<nothing>
我该怎么做才能使此映射起作用,以便 child 可以在子目录中创建文件,并且 parent 容器可以查看和访问这些文件? child 不允许看到 data1.txt(或子目录之上的任何其他内容)。
"Sibling" 容器是正确的术语,您标记的 "parent" 和 "child" 容器之间没有直接关系,即使您 运行 docker
命令在其中一个容器中。
安装了 docker 套接字的容器仍然控制主机上的 dockerd
运行ning,因此通过 [=37= 发送到 dockerd
的任何路径] 将在主机范围内。
有 docker
命令使用容器文件系统确实改变了一些事情。这是 docker
实用程序本身正在访问本地文件系统的时候。 docker build
docker cp
docker import
docker export
是 docker
与本地文件系统交互的示例。
坐骑
第二个容器使用-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
您 运行 的进程需要注意写入装载到多个容器中的数据的内容,以免数据被破坏。