如果 docker run 是“拿模板发车”,那 Dockerfile 就是:
你自己定义模板的说明书。
Docker 官方文档对 Dockerfile 的核心表述很直接:
- Dockerfile 按顺序执行指令
- 必须以
FROM开始 - 用来定义镜像内容和启动行为
一个最小 Node.js 例子:
FROM node:22-alpine
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm ci --omit=dev
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]你可以把它理解成:
装柜作业说明书
├── FROM 选哪种标准柜型作为底座
├── WORKDIR 进入柜内哪个工作区
├── COPY 把哪些货装进去
├── RUN 装柜时执行哪些安装动作
├── EXPOSE 告诉别人这个柜子打算监听哪个端口
└── CMD 柜子启动后默认干什么#1. FROM —— 先选底座货柜
FROM python:3.13-slim意思是:
- 基于
python:3.13-slim这个基础镜像 - 在它上面继续叠你的应用层
#2. WORKDIR —— 别在未知目录里施工
Docker 官方文档明确建议显式设置 WORKDIR。
WORKDIR /app这是因为后续 COPY、RUN、CMD 都会受它影响。
#3. COPY vs RUN
COPY . .
RUN npm ciCOPY:把文件从构建上下文放进镜像RUN:在构建阶段执行命令
#4. CMD 和 ENTRYPOINT
最实用的直觉:
CMD:默认启动参数ENTRYPOINT:主启动程序
例如:
ENTRYPOINT ["python", "app.py"]
CMD ["--port", "8000"]这表示:
- 默认一定执行
python app.py - 后面的
--port 8000可以被运行命令追加参数覆盖