Docker cp、docker export与docker save的区别及最优方案咨询
三种Docker文件提取操作的核心区别
方法1:
docker create+docker export
导出的是容器运行时的单层文件系统快照,输出的tar包不包含原镜像的分层信息、历史提交记录、镜像元数据(如启动入口、环境变量等配置),也不会包含未挂载的Volume数据。解压后是完全扁平的单级文件结构,和运行中容器的根目录内容完全一致。
你用到的对应命令为:# 创建占位容器 docker create -ti --name mysql_dummy mysql bash # 导出容器文件系统快照 docker export mysql_dummy > <path>/mysql.tar方法2:
docker save
导出的是完整的镜像本体,包含镜像所有的分层数据、历史提交记录、全部元数据配置。你看到的多层哈希目录结构就是Docker镜像原生的分层存储结构,这个tar包可以通过docker load命令完整恢复为原镜像,所有层信息、配置属性都不会丢失。
对应命令为:docker save mysql > <path>/mysql.tar方法3:
docker create+docker cp
直接把容器的文件系统内容复制到宿主机本地目录,和docker export的输出内容几乎完全一致,都是打平的单层文件结构,不包含层信息、镜像元数据。和docker export唯一的区别是docker cp直接输出为本地文件目录,不需要额外的解压步骤。
对应命令为:docker cp mysql_dummy:/. <path>
镜像多层合并为单份拷贝的实现方法
有两种成熟方案可以实现层合并:
- 直接使用上述
docker export或者docker cp方案,拿到的本身就是合并后的单层文件内容,如果需要转回单一层镜像,可以将导出的文件通过Dockerfile重新构建:基础镜像指定为scratch,再用ADD指令把整个文件系统添加进去即可。 - 构建镜像时开启Docker实验特性,使用
docker build --squash参数,构建过程会自动把所有层合并为单层;对于已有镜像也可以使用docker-squash工具处理,输出合并后的单一层镜像。
选型推荐
根据你需要处理容器内文件(包括.so文件)的需求,按场景选择即可:
- 仅需要提取文件本身做处理,不需要保留镜像元数据、层信息,优先选
docker cp,省略打包解压步骤,直接拿到本地目录即可操作,效率最高。 - 需要把提取的文件系统整体备份、转移,不需要保留镜像配置,选
docker export,输出单个tar包更方便传输存储。 - 需要完整保留镜像的所有配置、层信息,后续还要用
docker load重新导入为镜像使用,才选docker save。
内容的提问来源于stack exchange,提问作者rasilvap
相关产品推荐
相关产品推荐

