概述

你已经学会了编写 Dockerfile,但当你运行 docker build . 时,你真的清楚背后发生了什么吗?

为什么有时候构建很快,有时候却要重新安装依赖?
为什么镜像越来越大?
如何让构建更高效、更稳定?

最简单的构建命令

docker build .

这行命令的意思是:

“以当前目录为上下文,根据 Dockerfile 构建一个镜像。”

但你有没有注意到,Docker 会先显示:

Sending build context to Docker daemon  5.23MB

这说明:Docker 并不是只读取 Dockerfile,而是把整个目录打包发送给 Docker 守护进程

这就是“构建上下文(Build Context)

构建上下文

什么是构建上下文

  • docker build 命令中指定的目录(通常是 .
  • Docker 会把该目录下的所有文件打包,发送给守护进程
  • COPYADD 指令只能复制上下文内的文件

重要性

  • 如果目录中包含 node_modules.git、日志等大文件,会显著拖慢构建速度
  • 即使你在 Dockerfile 中没用到这些文件,它们也会被上传

解决方案:使用 .dockerignore 文件 ,参考上一篇文章

docker build 常用命令详解

命令 说明
docker build . 使用当前目录构建
docker build -f /path/Dockerfile.prod . 指定不同的 Dockerfile 文件
docker build -t myapp:1.0 . 给镜像打标签(推荐!)
docker build --no-cache . 禁用缓存,强制重新构建每一层
docker build --target builder . 多阶段构建中,只构建指定阶段
docker build --build-arg NODE_ENV=production . 传递构建参数

推荐标准命令:

docker build -t myapp:1.0 .
  • -t 打标签是最佳实践,避免生成 <none> 镜像

构建过程的分层与缓存机制

Docker 镜像是分层存储的,每一行 Dockerfile 指令生成一个“层”(Layer)。

示例

FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
CMD ["node", "server.js"]

构建时你会看到:

Step 1/5 : FROM node:18-alpine
Step 2/5 : WORKDIR /app
Step 3/5 : COPY package*.json ./
Step 4/5 : RUN npm ci --only=production
Step 5/5 : COPY . .

缓存机制:

  • Docker 会缓存每一层的结果
  • 只有当某一层发生变化时,其后的所有层才会重新构建
  • 因此:把变化少的指令放在前面,可以最大化利用缓存

常见问题:

COPY . .
RUN npm ci --only=production   # ❌ 错!代码变化会导致依赖重装

正确做法:

COPY package*.json ./          # ✅ 先复制依赖文件
RUN npm ci --only=production   # ✅ 缓存稳定
COPY . .                       # ✅ 代码变化只影响最后几层

多阶段构建:大幅减小镜像体积

如果你的项目需要编译(如前端打包、Java 编译),推荐使用多阶段构建

示例:React 项目

# 阶段 1:构建阶段
FROM node:18 as builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build

# 阶段 2:运行阶段
FROM nginx:alpine
COPY --from=builder /app/build /usr/share/nginx/html
EXPOSE 80

优势:

  • 构建环境(Node.js)不包含在最终镜像中
  • 最终镜像只包含 Nginx 和静态文件,体积极小

查看和管理构建产物

  1. 查看镜像
docker images
  1. 查看中间层(调试用)
docker images -a
  1. 删除无用镜像
docker rmi <image-id>
  1. 清理所有构建缓存(节省空间)
docker builder prune

最佳实践

实践 说明
始终使用 -t 打标签 方便管理、推送
使用 .dockerignore 减少上下文大小
合理组织 Dockerfile 层 利用缓存,提升构建速度
使用多阶段构建 减小镜像体积
选择轻量基础镜像 alpineslim
避免在镜像中存储敏感信息 如密码、密钥

总结

docker build 不只是一个命令,它是一个包含上下文、分层、缓存、优化策略的完整流程

掌握它,你才能:

  • 构建出高效、安全、轻量的镜像
  • 在 CI/CD 中实现快速、稳定的交付
  • 真正理解 Docker 的工作原理
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐