You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在低速不稳定网络下仅传输差异更新Docker镜像

解决Docker镜像差异传输的方案

一、直接提取镜像间的差异文件传输

这是最直接的方式,仅传输实际变更的内容:

  • 在本地执行docker diff <现有镜像ID> <最新镜像ID>,或分别启动两个临时容器后对比文件差异,输出结果会标记出新增(A)、修改(C)、删除(D)的文件路径。
  • 从最新镜像的临时容器中复制这些差异文件:docker cp <临时新容器名>:/目标文件路径 ./diff-files/
  • 将diff-files目录打包为压缩包(如tar zcf diff.tar.gz diff-files/),包体积仅为实际变更的大小。
  • 把压缩包传到客户机器后,直接解压覆盖到客户运行的容器,或基于现有镜像创建新镜像时添加这些文件。

二、单独提取COPY层传输

如果已通过COPY指令创建了独立的变更层,可单独导出该层传输:

  • 执行docker history <最新镜像ID>,找到对应COPY操作的行,记录其短IMAGE ID(如abc123)。
  • 单独导出该层:docker save <层ID> -o copy-layer.tar,此tar包仅包含该COPY层内容,体积极小。
  • 传到客户机器后加载该层:docker load -i copy-layer.tar。
  • 基于客户现有镜像构建新镜像:docker build -t <更新后镜像名> - <<EOF FROM <客户现有镜像ID> COPY --from=<层ID> / / EOF

三、用docker export配合rsync增量传输

针对docker save+rsync效果差的问题,改用容器文件系统全量导出做增量同步:

  • 本地启动最新镜像的临时容器:docker run -d --name temp-new <最新镜像ID> sleep infinity
  • 导出容器为完整文件系统tar包:docker export temp-new -o new-image.tar
  • 让客户在本地导出现有容器的tar包:docker export temp-old -o old-image.tar
  • 用rsync增量参数传输:rsync --compare-dest=/客户机器上old-image.tar的路径 new-image.tar user@客户机器IP:/目标路径/,rsync会仅传输两个tar包的差异部分。
  • 客户将收到的tar包导入为新镜像:docker import new-image.tar <更新后镜像名>

为什么之前docker save+rsync效果差?

docker save生成的归档包是把镜像的每一层单独打包成tar文件后再整体封装。rsync仅对比整个归档文件的二进制差异,不会解析归档内的分层内容,即使只有1MB文件变更,整个归档的二进制差异也可能达到200+MB,因此无法实现有效增量传输。

内容的提问来源于stack exchange,提问作者spitfire

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 03:30:46