docker import 是什么
import 把一份根文件系统归档(通常来自 docker export,也可以是其他来源的 tar)导入成本地镜像。产物是一个只有单层的镜像:没有构建历史,也没有启动命令、环境变量、端口声明这些元数据。因此导入之后通常要用 --change 追加指令补齐配置,否则容器可能启动即退出或行为与预期不符。
基本信息
| 语法 | docker import [选项] 文件或URL或- [仓库[:标签]] |
|---|---|
| 常用选项 | -c/--change 追加 Dockerfile 指令(CMD、ENTRYPOINT、ENV、EXPOSE、WORKDIR、USER、LABEL、ONBUILD 等) |
| 标准输入 | - 表示从标准输入读取,可配合解压管道 |
| 产物特性 | 单层文件系统镜像,无历史记录 |
| 来源限制 | 不能直接导入镜像归档(那属于 docker load) |
| 安全提示 | 导入不做扫描,来源不明的归档应先检查内容 |
典型使用场景
- 从旧式根文件系统快照恢复出可运行镜像
- 接收外部交付的 tar 包,需要快速变成镜像并在本地点起
- 把某台机器上导出的文件系统做成基础镜像,再在其上构建业务镜像
- 离线环境里处理没有镜像标签的历史归档
- 与 export 配套使用:先导出用于分析,再按需导入回去
导入与补配置
导入与补配置
# 基础导入:只有文件系统内容,没有启动配置
docker import web-rootfs.tar app/web:imported
# 追加启动命令与工作目录,导入即有可运行配置
docker import --change 'CMD ["nginx","-g","daemon off;"]' \
--change 'WORKDIR /usr/share/nginx/html' \
--change 'EXPOSE 80' web-rootfs.tar app/web:imported
# 从标准输入导入(配合解压)
gzip -dc web-rootfs.tar.gz | docker import - app/web:stdin
# 核对导入结果与启动验证
docker image inspect app/web:imported --format '{{.Config.Cmd}} {{.Config.Entrypoint}} {{.Config.WorkingDir}}'
docker run --rm app/web:imported nginx -v常见问题判读
| 现象 | 原因 | 处理方向 |
|---|---|---|
| 容器启动即退出 | 没有 CMD/ENTRYPOINT | 用 --change 补启动命令 |
| 应用找不到文件 | 缺少 WORKDIR 或路径假设不同 | 补 WORKDIR 或改启动命令 |
| 外部访问不到服务 | 没有 EXPOSE 声明(仅元数据) | 补 EXPOSE 并在运行时发布端口 |
| 以 root 运行不符合基线 | 缺少 USER 指令 | 补 USER,并核对文件属主 |
| 镜像只有一层 | import 的设计如此 | 如需分层请走正常构建流程 |
EXPOSE 是声明而非发布:它只记录端口信息,真正对外暴露仍需运行时发布端口或编排文件里配置映射。
import 不会做任何内容检查,来源不明的 tar 包可能携带后门或多余账号。导入前建议解包检查关键目录,并在隔离环境先跑一遍再投入生产。