Skip to content

Docker - 构建镜像

一旦创建了包含镜像构建指令的 Dockerfile 文件,下一步就是使用 docker build 命令来构建镜像。

此命令从 Dockerfile 和“上下文 (context)”构建 Docker 镜像。上下文是一组位于指定位置 (PATH 或 URL) 的文件,通常是包含 Dockerfile 的目录。

docker build [OPTIONS] PATH | URL | -
  • -t, --tag name:tag:使用 ‘name:tag’ 格式命名镜像并可选地指定标签。强烈建议使用此选项以便于引用。
  • -f, --file path/to/Dockerfile:如果 Dockerfile 文件未命名为 Dockerfile 或不在上下文目录的根目录下,则指定其路径。
  • . (点号):通常用作 PATH 参数,表示当前目录为构建上下文。
  • --no-cache:禁用构建缓存,强制 Docker 重新运行所有指令。
  • --build-arg key=value:设置构建时变量,可在 Dockerfile 中的 ARG 指令中使用。

假设您在当前目录(.)中有一个简单的 Dockerfile:

# Simple Dockerfile example
FROM ubuntu:22.04
LABEL maintainer="demo@example.com"
RUN apt-get update && apt-get install -y --no-install-recommends curl && apt-get clean && rm -rf /var/lib/apt/lists/*
CMD ["echo", "My custom image built successfully!"]

要构建此镜像并将其标记为 myimage,版本为 0.1,可以运行:

docker build -t myimage:0.1 .

解释:

  • docker build:启动构建过程的命令。
  • -t myimage:0.1:将生成的镜像标记为 myimage,标签为 0.1。
  • .:指定当前目录为构建上下文。Docker 将在此处查找 Dockerfile,并将此目录的内容(遵循 .dockerignore)发送给 Docker 守护进程 (daemon)。

在构建过程中,Docker 按顺序执行 Dockerfile 中的每条指令:

  • 从 FROM 指令开始,如果本地不存在基础镜像(ubuntu:22.04),则可能先拉取它。
  • 对于后续的每条指令(LABEL, RUN, CMD 等),Docker 会检查是否可以重用先前构建中的缓存层。如果指令及其上下文没有改变,就会使用缓存(从而加快构建速度)。
  • 如果无法从缓存中重用层(或禁用了缓存),Docker 会执行该指令,创建一个新的中间容器,运行命令(例如 apt-get update ...),并将结果提交为一个新的镜像层。
  • 您将看到指示步骤编号、正在执行的指令以及中间容器 ID 的输出。
  • 最后,如果构建成功,它会将最终层标记为您指定的名称和标签(myimage:0.1),并报告最终的镜像 ID。

示例输出片段:

Sending build context to Docker daemon 2.048kB
Step 1/4 : FROM ubuntu:22.04
---> a7be6190844e
Step 2/4 : LABEL maintainer="demo@example.com"
---> Running in abcdef123456
---> 2f3a4b5c6d7e
Removing intermediate container abcdef123456
Step 3/4 : RUN apt-get update && apt-get install -y --no-install-recommends curl && apt-get clean && rm -rf /var/lib/apt/lists/*
---> Running in 123456abcdef
(apt-get output...)
---> 8e7d6c5b4a3f
Removing intermediate container 123456abcdef
Step 4/4 : CMD ["echo", "My custom image built successfully!"]
---> Running in fedcba987654
---> 9a8b7c6d5e4f
Removing intermediate container fedcba987654
Successfully built 9a8b7c6d5e4f
Successfully tagged myimage:0.1

构建完成后,您可以使用 docker images 验证镜像是否存在:

docker images

您应该会看到列出了 myimage 及其标签 0.1。现在可以从这个自定义镜像运行容器了。

构建上下文非常重要。当使用 COPY 或 ADD 等指令时,Docker 会在上下文目录内查找指定的文件。发送不必要的文件(如 .git 目录、构建产物、本地依赖项)会减慢构建速度并增加镜像大小。在上下文目录根目录使用 .dockerignore 文件(语法类似于 .gitignore)来排除文件和目录,使其不被发送到守护进程 (daemon)。