如何在不复制数据的情况下共享Docker容器目录至其他容器?
无需复制数据的容器间静态数据共享方案
针对你要共享镜像内2.5G静态数据的需求,我给你推荐一个完全避免数据复制的方案,核心是利用Docker的容器数据共享机制,同时避开会触发数据复制的命名卷挂载逻辑:
问题根源分析
先帮你理清之前两种方法的问题:
- 第一种方法里,你给Container-A挂载了命名卷
shareddata到/opt/test/data,Docker的默认行为是当挂载的卷为空时,自动把容器该目录的镜像层内容复制到卷中,这就是你看到主机上出现重复数据的原因。 - 第二种方法的软链接失效,是因为软链接是基于单个容器内的文件系统路径,Container-B的文件系统和Container-A隔离,除非共享同一个卷路径,否则软链接无法解析到正确位置。
最优解决方案
我们要直接共享Container-A镜像自带的/opt/test/data目录内容,完全不涉及数据复制到主机卷:
1. 启动作为数据载体的Container-A
不需要给/opt/test/data挂载任何卷,直接用你的test镜像启动容器,让它保留镜像构建时的原始数据。为了确保容器持续可用(--volumes-from依赖容器存在),可以用sleep让它后台运行:
docker run -d --name container-a --entrypoint sleep test infinity
2. 启动多个Container-B共享数据
启动test-prod容器时,通过--volumes-from参数挂载Container-A的/opt/test/data目录,这样Container-B内的/opt/test/data会直接指向Container-A镜像层中的数据,完全没有数据复制:
docker run -it --name container-b1 --volumes-from container-a test-prod:latest docker run -it --name container-b2 --volumes-from container-a test-prod:latest # 可以启动任意多个需要共享数据的Container-B
额外说明
- 这个方案里,Container-A只是作为数据的“载体”,不需要处理任何业务逻辑,它的唯一作用是提供镜像内的静态数据供其他容器访问。
- 只要Container-A处于运行(或存在)状态,所有通过
--volumes-from挂载的Container-B都能实时访问到/opt/test/data的内容,而且这些内容完全来自test镜像的构建层,不会在主机上产生任何重复数据。 - 如果后续需要更新静态数据,只需要重新构建
test镜像,重启Container-A,再重启各个Container-B即可生效。
内容的提问来源于stack exchange,提问作者Abhinav
相关产品推荐
相关产品推荐

