我有多个 docker 容器,它们都必须在子目录中有共同的内容。这个常见的内容几乎是标准的,所以我很高兴能够以某种方式打包它。
一种选择是创建一个卷,将文件放入卷中,然后将容器绑定(bind)到卷,但是根据我对 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
此图像包含要用于要使用的容器的默认数据
我们正在使用一个小图像(“hello-world”),因为它需要一个命令来
允许从它创建一个容器
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. 为您的应用使用音量
然后启动您的应用程序容器,并附加卷(现在
包含模板数据)。
对于这个例子,我只是启动一个 alpine 容器并显示内容
量,但通常这将是您的应用程序;
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
希望这可以帮助!
关于docker - 我可以在 docker 中创建一个 "template volume"吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37596716/