使用docker commit从现有容器制作镜像后新容器无data文件夹如何解决
根因分析
你遇到的问题是Docker docker commit 命令的默认机制导致的:如果原容器Container1里的data文件夹属于挂载卷(Volume)(包括匿名卷、具名卷或者宿主机绑定挂载),Docker默认不会将卷内的内容提交到新镜像的镜像层中,该行为和是否能访问DockerHub无关。
本地解决方案(全程无需访问DockerHub)
方案1:复制数据后基于现有镜像重制(最推荐)
- 将原容器内的data目录拷贝到宿主机本地:
docker cp Container1:/你的/data目录实际路径 ./local_data - 新建Dockerfile写入以下内容:
FROM 你之前commit生成的镜像名:对应标签 COPY ./local_data /你的/data目录实际路径
- 本地执行构建命令生成新镜像:
docker build -t 自定义新镜像名:自定义标签 .
用该新镜像启动的容器会自带完整的data目录内容。
方案2:导出容器直接生成镜像(适合需要全量保留容器运行态的场景)
docker export 命令会打包容器的全量文件系统,包含挂载卷内的内容:
- 导出原容器为本地压缩包:
docker export Container1 > container1_full.tar - 将压缩包导入为本地镜像:
docker import container1_full.tar 自定义新镜像名:自定义标签
方案3:临时调整目录后重新commit
- 进入原容器将data目录复制到非挂载路径:
docker exec -it Container1 bashcp -r /你的/data目录实际路径 /data_backup - 退出容器后重新执行commit:
docker commit Container1 自定义新镜像名:自定义标签 - 用新镜像启动容器后,执行
mv /data_backup /你的/data目录实际路径即可恢复目录。
内容的提问来源于stack exchange,提问作者Farah Jabeen
相关产品推荐
相关产品推荐

