我可以创建一个"模板卷"在码头工人?

时间:2016-06-02 15:55:05

标签: docker

我有多个docker容器,所有这些容器都必须在子目录中有一个共同的内容。这个常见的内容非常标准,所以我很乐意以某种方式打包它。

一种选择是创建卷,将文件放入卷中,然后将容器绑定到卷,但是根据我对docker卷的理解,结果是卷在容器之间共享。容器对卷的内容所做的任何更改都将显示在另一个容器中。我不想要这个。

请注意,保持只读是不可取的。我希望数据是可读写的,我只是不希望它在容器之间共享,同时我也不想将它们保存在图像中。

在Docker中这可能吗?

1 个答案:

答案 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

希望这有帮助!