Docker 镜像不是一个整块文件的黑盒。
Docker 官方文档强调:
- 镜像由层组成
- 层是按顺序堆叠的
- 每层表示相对上一层的变更
类比成装柜记录:
镜像层(Layer)
├── 第1层:基础操作系统和运行时
├── 第2层:安装系统依赖
├── 第3层:安装应用依赖
├── 第4层:拷贝业务代码
└── 第5层:设置启动命令#1. 为什么层很重要
因为 Docker 可以复用没变的层。
FROM node:22-alpine
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm ci
COPY . .
CMD ["node", "server.js"]这段顺序就很合理:
- 先拷依赖清单
- 先装依赖
- 再拷业务代码
这样如果你只是改了应用代码而没改依赖,前面的依赖安装层可以复用,不用每次重新 npm ci。
#2. 新手最常写错的层顺序
错误示例:
COPY . .
RUN npm ci这会导致:
- 代码一改
- 前面的
COPY . .层就变了 RUN npm ci后面的缓存也很容易失效
#3. 层的本质心智
Layer
= 增量变更记录
不是完整副本重复打包