全书目录

第十篇:Docker 完全指南 —— 国际港口集装箱宇宙

第五章:Dockerfile —— 装柜作业说明书

2 分钟 464 字 第 151 / 962 个阅读单元

如果 docker run 是“拿模板发车”,那 Dockerfile 就是:

你自己定义模板的说明书。

Docker 官方文档对 Dockerfile 的核心表述很直接:

  • Dockerfile 按顺序执行指令
  • 必须以 FROM 开始
  • 用来定义镜像内容和启动行为

一个最小 Node.js 例子:

dockerfile

FROM node:22-alpine

WORKDIR /app

COPY package.json package-lock.json ./
RUN npm ci --omit=dev

COPY . .

EXPOSE 3000

CMD ["node", "server.js"]

你可以把它理解成:

text
装柜作业说明书
├── FROM            选哪种标准柜型作为底座
├── WORKDIR         进入柜内哪个工作区
├── COPY            把哪些货装进去
├── RUN             装柜时执行哪些安装动作
├── EXPOSE          告诉别人这个柜子打算监听哪个端口
└── CMD             柜子启动后默认干什么
#1. FROM —— 先选底座货柜
dockerfile
FROM python:3.13-slim

意思是:

  • 基于 python:3.13-slim 这个基础镜像
  • 在它上面继续叠你的应用层
#2. WORKDIR —— 别在未知目录里施工

Docker 官方文档明确建议显式设置 WORKDIR

dockerfile
WORKDIR /app

这是因为后续 COPYRUNCMD 都会受它影响。

#3. COPY vs RUN
dockerfile
COPY . .
RUN npm ci
  • COPY:把文件从构建上下文放进镜像
  • RUN:在构建阶段执行命令
#4. CMDENTRYPOINT

最实用的直觉:

  • CMD:默认启动参数
  • ENTRYPOINT:主启动程序

例如:

dockerfile
ENTRYPOINT ["python", "app.py"]
CMD ["--port", "8000"]

这表示:

  • 默认一定执行 python app.py
  • 后面的 --port 8000 可以被运行命令追加参数覆盖