docker import 命令用于从一个归档文件(如 .tar 文件)、URL 或标准输入流创建一个新的 Docker 镜像,它不像 docker load 那样会保留镜像的历史记录层,而是将归档文件的内容直接作为镜像的新的一层。

(图片来源网络,侵删)
命令格式
docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]
核心参数详解
docker import 的参数主要分为两类:控制镜像元数据的选项和指定源数据与目标镜像的参数。
控制镜像元数据的选项
这些选项用于在创建镜像时设置其标签信息。
| 选项 | 简写 | 描述 |
|---|---|---|
-c, --change |
在导入时应用 Dockerfile 指令,可以多次使用,这对于在导入时添加 LABEL、ENV 等信息非常有用。 |
|
-m, --message |
为导入的镜像创建提交信息,类似于 git commit 中的 -m 参数,用于记录镜像的变更或来源。 |
源数据和目标镜像参数
这部分是命令的必需部分。
| 参数 | 描述 |
|---|---|
file \| URL \| - |
源数据:指定要导入的内容来源。 - file: 一个本地归档文件路径(my-app.tar)。- URL: 一个指向归档文件的 HTTP/HTTPS URL。- : 标准输入流,你可以通过管道将一个归档文件的内容直接导入, cat my-app.tar \| docker import - my-app:v1。 |
[REPOSITORY[:TAG]] |
目标镜像:指定要创建的镜像的仓库名和标签。 - REPOSITORY: 镜像仓库名,通常以用户名或组织名开头,myusername/myapp。- TAG: 镜像标签,用于区分版本,v1.0, latest,如果省略标签,默认为 latest。> 注意: 这个部分是可选的,但强烈推荐使用,以便于后续管理。 |
使用场景与示例
从本地 .tar 文件创建镜像
这是最常见的用法,通常用于备份或分发一个系统的文件系统。

(图片来源网络,侵删)
示例:
假设你有一个 ubuntu-base.tar 文件,它是一个干净的最小化 Ubuntu 系统的文件系统压缩包。
# 1. 导入 tar 文件,创建名为 my-custom-ubuntu:v2.0 的新镜像 # -m "..." 添加了镜像的提交信息 docker import -m "基于 Ubuntu 20.04 的最小化系统" ubuntu-base.tar my-custom-ubuntu:v2.0
执行后,你可以用 docker images 查看新创建的镜像:
REPOSITORY TAG IMAGE ID CREATED SIZE my-custom-ubuntu v2.0 <image-id> a few seconds ago 120MB
从 URL 创建镜像
你可以直接从一个网络链接导入镜像,这在你不想下载文件到本地时很有用。
示例:
从某个 URL 下载一个归档文件并直接导入。
# 从 URL 导入,并指定标签为 latest docker import https://example.com/path/to/my-app.tar my-app-from-url:latest
从标准输入流 创建镜像
这种方式非常适合与管道结合使用,尤其是在自动化脚本中。
示例:
- 创建一个容器,并在其中完成一些操作,比如安装软件。
- 将这个容器的文件系统导出为 tar 包,并通过管道直接导入为一个新的镜像。
# 1. 运行一个 ubuntu 容器 docker run -it --name temp-workspace ubuntu bash # 2. 在容器内部(进入 bash 后)执行一些操作,比如安装 nginx # apt-get update && apt-get install -y nginx && exit # 3. 退出容器后,将容器的文件系统导出,并通过管道导入为镜像 # -m "..." 记录了镜像的变更 # my-nginx-image:v1 是新镜像的名称和标签 docker export temp-workspace | docker import -m "基于 Ubuntu 官方镜像,预装了 Nginx" - my-nginx-image:v1 # 4. 启动新镜像的容器验证 docker run -it --rm my-nginx-image:v1 nginx -v # 输出类似:nginx version: nginx/1.18.0 (Ubuntu)
使用 -c 选项添加元数据
docker import 本身不处理 Dockerfile 指令,但你可以使用 -c 选项来添加一些简单的元数据。
示例:
在导入时添加作者信息和环境变量。
docker import -c "LABEL maintainer=\"Your Name <your.email@example.com>\"" \
-c "ENV APP_VERSION=1.0.0" \
ubuntu-base.tar my-labeled-ubuntu:v1.0
docker import vs. docker load (重要区别)
这是一个非常常见的混淆点,理解它们的区别至关重要。
| 特性 | docker import |
docker load |
|---|---|---|
| 源数据 | 一个文件系统归档 (.tar 文件),不包含镜像的元数据和历史记录。 |
一个完整的镜像归档 (通过 docker save 生成),包含镜像的所有层、历史记录和元数据。 |
| 镜像历史 | 会丢弃,创建的镜像只有一层,即导入的文件系统。 | 会保留,加载的镜像拥有完整的历史记录层。 |
| 用途 | 用于创建基础镜像或从一个现有的文件系统构建镜像。 | 用于备份和恢复一个或多个完整的镜像。 |
| 命令示例 | docker import archive.tar myimage:v1 |
docker load -i myimage.tar |
| 文件来源 | 可以是本地文件、URL 或标准输入流。 | 通常是本地文件或标准输入流。 |
简单总结:
- 用
docker save保存一个完整的、有历史的镜像,用docker load恢复它。 - 用
docker export导出一个容器的文件系统,用docker import将其转换成一个新的、无历史的基础镜像。
最佳实践
- 为镜像打上标签:始终为
docker import创建的镜像指定[REPOSITORY:TAG],否则它会被标记为<none>:<none>,难以管理。 - 使用
-m提交信息:养成使用-m选项记录镜像来源或变更内容的习惯,便于团队协作和后续维护。 - 谨慎使用
-c:虽然-c可以添加标签,但对于复杂的镜像构建(如安装软件、设置环境变量),推荐使用Dockerfile和docker build命令。docker import更适合用于创建一个干净的、基础的环境。 - 明确来源:清楚地知道你的
.tar文件来自哪里,确保其安全性和完整性,特别是从 URL 导入时。
