docker import 本质是将已停止容器的文件系统层打包为扁平化静态镜像,不保留元数据(如CMD、ENV、网络配置等),仅保留rootfs变更;需先确保容器处于exited状态,配合--change可显式添加指令,但不可复现运行时状态。使用 `docker import` 将容器快照转为静态镜像,本质是把一个**正在运行或已停止的容器的文件系统层**打包成新镜像。它不保留原容器的元数据(如 CMD、ENV、网络配置、挂载点等),只保留最底层的文件系统变更——这点和 `docker commit` 有本质区别。
关键前提:容器必须已停止(不能是运行中状态)。`docker import` 只读取容器的 rootfs 目录,因此需先确保容器处于 exited 状态。
1. 获取目标容器 ID 或名称
列出所有容器(含已退出的):
-
docker ps -a—— 找到你想要导出的容器,记下其 CONTAINER ID 或 NAMES 列值 - 例如输出中有:
abc123456789 ubuntu:22.04 "/bin/bash" 2 hours ago Exited (0) 5 minutes ago my-test-container
2. 执行 import 操作并指定镜像名与标签
语法为:docker import [选项] [[:]]
- 基础用法:
docker import abc123456789 myapp:v1.0 - 带作者信息:
docker import --change "author=dev@example.com" abc123456789 myapp:v1.0 - 设置默认启动命令(覆盖空镜像无 CMD 的问题):
docker import --change 'CMD ["/bin/bash"]' abc123456789 myapp:v1.0 - 注意:
--change支持多次使用,可叠加 ENV、EXPOSE、VOLUME 等指令(但仅写入镜像配置,不执行)
3. 验证生成的镜像是否可用
导入完成后立即检查:
-
docker images | grep myapp—— 应看到myapp镜像及其标签、创建时间、大小 - 尝试运行:
docker run --rm -it myapp:v1.0 ls /—— 若能列出根目录内容,说明镜像结构正常 - 查看镜像历史:
docker history myapp:v1.0—— 会显示单一层(<missing></missing>),确认它是扁平化导入而非分层构建
4. 注意事项与常见陷阱
-
不会继承原容器的环境变量或工作目录 —— 即使原容器通过
-e或-w启动,import 后这些均丢失,需用--change "ENV KEY=VAL"显式添加 -
无法还原 volume 数据 —— 容器挂载的卷(如
-v /host/path:/container/path)不在 rootfs 中,import 不包含它们 - 不推荐用于生产镜像构建 —— 因不可复现、无构建上下文、缺乏分层缓存;更适合临时备份、离线迁移或调试快照固化
- 若需保留完整运行时配置(CMD/ENTRYPOINT/PORTS/VOLUMES),请改用
docker commit(但 commit 仍不保存运行时状态如内存、进程)











