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

标签 docker

我有多个 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/

相关文章:

ssl - flocker-docker-plugin 不起作用

node.js - 无法构建docker镜像

docker - Mup安装失败,显示 “endpoint with name mongodb already exists in network bridge”

docker mount nfs with local_lock=all

docker - webpack通过改善dockerfile来提高自动化

java - 使用 Kubernetes Docker 的客户端证书调用端点时出现 SunCertPathBuilderException

docker - Hyperledger Composer 添加一个新的节点

docker - 是否可以让 ansible 打印每个语句?

docker - Timescaledb扩展未间歇性启用

postgresql - docker postgres初始化脚本似乎无法创建db用户,命令被忽略