我有多个docker容器,所有这些容器都必须在子目录中有一个共同的内容。这个常见的内容非常标准,所以我很乐意以某种方式打包它。
一种选择是创建卷,将文件放入卷中,然后将容器绑定到卷,但是根据我对docker卷的理解,结果是卷在容器之间共享。容器对卷的内容所做的任何更改都将显示在另一个容器中。我不想要这个。
请注意,保持只读是不可取的。我希望数据是可读写的,我只是不希望它在容器之间共享,同时我也不想将它们保存在图像中。
在Docker中这可能吗?
答案 0 :(得分:2)
只要您不为其他容器重复使用相同的卷,就可以使用泊坞窗图像作为模板,并使用它来传播"传播"体积数据;
<强> 1。为所有模板文件创建目录;
mkdir data
# just creating some dummy files here to illustrate the concept
touch data/foo data/bar data/baz data/bla data/bla2
<强> 2。创建用于构建模板图像的Dockerfile
此图像包含要用于要使用的容器的默认数据 我们正在使用一个小图像(&#34; hello-world&#34;),因为它需要一个命令 允许从中创建容器
FROM hello-world
COPY . /data/
第3。构建模板图像
docker build -t template-data .
<强> 4。创建新卷并传播数据
然后,您可以创建卷,从图像创建容器,以及 将音量附加到它。第一次使用音量并且仍然是 为空,文件从容器复制到卷。
在创建和传播卷之后,我们并不真正需要
容器不再(数据被复制到卷),所以我们通过了
--rm
标志也是如此,因此容器(不是音量,因为它是a
&#34;命名&#34;在退出后直接删除
# create an empty volume
docker volume create --name data-volume1
# start the container (which copies the data), and remove the container
docker run -it --rm -v data-volume1:/data template-data
<强> 5。使用您的应用程序的卷
然后启动您的应用程序容器,并附加卷(现在 包含模板数据)。
对于这个例子,我只是启动一个高山容器并显示内容 音量,但通常这将是你的应用程序;
docker run --rm -v data-volume1:/somewhere alpine ls -l /somewhere
你可以看到数据存在;
docker run --rm -v data-volume1:/somewhere alpine ls -l /somewhere
total 0
-rw-r--r-- 1 root root 0 Jun 2 20:14 bar
-rw-r--r-- 1 root root 0 Jun 2 20:14 baz
-rw-r--r-- 1 root root 0 Jun 2 20:14 bla
-rw-r--r-- 1 root root 0 Jun 2 20:14 bla2
-rw-r--r-- 1 root root 0 Jun 2 20:14 foo
您可以多次执行此操作,但需要创建新卷 对于每个项目/应用程序,否则它们共享相同的卷, 所以正在研究相同的数据;
docker volume create --name data-volume2
docker volume create --name data-volume3
docker volume create --name data-volume4
docker run -it --rm -v data-volume2:/data template-data
docker run -it --rm -v data-volume3:/data template-data
docker run -it --rm -v data-volume4:/data template-data
docker run --rm -v data-volume2:/somewhere alpine ls -l /somewhere
docker run --rm -v data-volume3:/somewhere alpine ls -l /somewhere
docker run --rm -v data-volume4:/somewhere alpine ls -l /somewhere
希望这有帮助!