如何在Docker容器间共享只读(RO)数据且无需复制?
解决Docker容器间只读共享大体积数据(避免复制)
最优方案:使用数据容器共享数据
无需复制80GB数据,直接复用data-image镜像内的/data目录:
创建一个仅用于提供数据的容器(无需启动,创建即可):
docker create --name data-provider data-image此操作仅基于镜像生成容器元数据,不会触发任何数据复制。
启动
runner-image容器时,挂载该数据容器的/data目录并设置为只读:docker run --volumes-from data-provider:ro runner-image ls /data:ro标记确保runner-image只能读取数据,无法修改原始内容。
备选方案:直接挂载镜像文件系统(进阶)
若不想创建额外容器,可直接挂载data-image的文件系统路径,前提是知晓镜像存储的宿主机路径:
获取
data-image的合并层目录:DATA_IMAGE_MERGED_DIR=$(docker inspect data-image -f '{{ .GraphDriver.Data.MergedDir }}')通过bind mount挂载
/data目录到runner-image容器:docker run --mount type=bind,source=${DATA_IMAGE_MERGED_DIR}/data,target=/data,readonly runner-image ls /data注意:该方法依赖Docker存储驱动(如overlay2),不同环境路径可能有差异,可移植性较差。
原方案触发数据复制的原因
你之前使用docker run --volume data-volume:/data:ro data-image时,Docker会自动将容器内/data的内容复制到新创建的data-volume中——这是Docker初始化named volume的默认行为,目的是填充volume内容。而上述方案绕过了这个初始化步骤,直接复用镜像中的原始数据。
内容的提问来源于stack exchange,提问作者ridiculous_fish
相关产品推荐
相关产品推荐

