我可以在 docker 中创建"template volume"吗?



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

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

请注意,保持只读不是一种选择。我希望数据是读写的,我只是不希望它在容器之间共享,同时我也不希望将它们保留在图像中。

这在Docker有可能吗?

只要不将同一卷重复用于其他容器,就可以使用docker映像作为模板,并使用它来"传播"卷数据;

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来构建模板镜像

此图像包含要用于要使用的容器的默认数据我们使用一个小图像("你好世界"),因为它需要一个命令允许从创建容器

FROM hello-world
COPY . /data/

3.构建模板图像

docker build -t template-data .

4.创建一个新卷,并传播数据

然后,您可以创建体积,根据图像创建容器,然后将卷附加到它上。卷第一次使用并且仍然如果为空,则文件将从容器复制到卷中。

在创建并传播卷之后,我们实际上并不需要容器(数据被复制到卷),因此我们将--rm标志,这样容器(而不是卷,因为它是"命名"卷)在退出后被直接删除

# 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

希望这能有所帮助!

最新更新