我有一个容器-A,它有目录/opt/test/data,其中包含在构建映像过程中创建的文件。现在,我想将/opt/test/data(容器-一个目录)共享给Container,因为它需要在其生命周期中使用这些文件。我试过以下选项
docker run -it -d -v shareddata:/opt/test/data --name container-a test然后运行容器-b作为
docker run -it --volumes-from container-a --name container-b test-prod:latest数据被共享,但它在主机上创建了一个命名卷共享数据,其中包含容器-a的/opt/test/data目录的重复数据。
我尝试了另一种选择,即创建名称卷数据并将其挂载到容器-a中。然后,我在挂载卷上创建了/opt/test/data的符号链接,如下所示
ln -s /data/data /opt/test/data现在,将/data卷挂载到容器-b,但是符号链接没有在容器-b上工作,因为它显示它是断开的链接。
是否有一种方法可以共享容器(一个目录到容器-b),而不复制数据,因为我们希望保持数据的静态和相当大的大约2.5G到一个映像,然后一个实例继续运行,在多个容器之间共享测试-prod映像?
发布于 2022-08-02 13:50:34
如果你愿意并且可以用波德曼代替码头,它应该能够做到:
--mount选项支持type=image,所以类似于
podman运行--挂载type=image,source=test,目的地=/opt/test/data test-prod:最新
应该行得通。如果您不能转到podman,那么控制containerd的低级别containerd命令(现在在码头下面,也包括大多数库伯内特斯安装)有一个ctr image mount命令,它的工作方式与播客坐骑命令类似。不幸的是,我找不到合适的文档。此外,该命令可能不会安装在您的系统上。
发布于 2022-09-19 11:25:18
另一种选择是在共享pid命名空间时通过/proc文件系统访问它。
$ docker run -d --name container-a test sh -c 'echo $$; while :; do sleep 1; done'
$ docker run -it --pid container:container-a --name container-b -e "A_PID=$(docker logs container-a)" test-prod:latest然后,目录应该可以在/proc/$A_PID/root/opt/test/data上使用。
除了共享PID命名空间之外,容器还必须使用相同的UID才能工作。
解释:
/proc/pid/root下使用。只有具有相同UID的进程才能访问它(应该适用与ptrace相同的规则)。--pid container:容器标志共享PID命名空间,这使得可以从另一个容器访问/proc/pid。发布于 2018-01-10 11:17:50
通常的方法是在启动容器时创建这些文件,而不是在构建时创建这些文件。您可以首先检查文件是否已创建,如果未创建,则创建它们(或从/tmp或摇摆器中移动它们)。
例如,mysql的官方图像就是这样做的。
然后,您可以在该目录中挂载卷,并在容器之间共享它。
https://stackoverflow.com/questions/48186109
复制相似问题