dockerfile 以 from 为首,定义基础镜像;run 构建时执行并分层;copy 优先于 add 复制文件;cmd 设置容器启动命令且仅一个生效。

FROM 是 Dockerfile 的起点,没有它就无法构建镜像;CMD 是容器启动时的默认行为,但不会在构建阶段执行。整份文件是线性、分层、不可逆的构建过程,每条指令生成一个只读镜像层,理解这一点才能写出稳定可复用的 Dockerfile。
FROM:必须为首,慎选基础镜像
它是 Dockerfile 中第一条非注释指令,定义整个构建的起点。语法为 FROM <image>[:<tag>] [AS <name>]</name></tag></image>:
- 标签必须显式指定,比如
python:3.11-slim,避免使用latest(版本不可控) - 优先选用官方镜像(如
nginx:alpine、openjdk:17-jdk-slim),体积小、更新及时、漏洞少 - 多阶段构建中可用
AS命名阶段,例如FROM golang:1.23 AS builder,便于后续阶段引用 - 极简场景下可用
FROM scratch,适合打包静态二进制程序(如 Go 编译后无依赖的可执行文件)
RUN:构建时执行,合并命令更高效
用于在构建过程中运行命令并提交结果到新镜像层。推荐用 shell 形式(RUN apt-get update && apt-get install -y ...):
MiniMax 图片理解 + 网络搜索 MCP 工具。适配 Docker 环境(极空间等),支持图片 OCR 识别、图像内容理解、网络搜索。API Key 安全存储在本地 credentials 文件,不暴露在代码中。
- 多个操作尽量合并成一条 RUN 指令,减少镜像层数(每条 RUN 都新增一层)
- 安装软件后记得清理缓存,例如
&& rm -rf /var/lib/apt/lists/*,避免无谓体积膨胀 - 若需换行提升可读性,用反斜杠
\续行,但注意末尾不能有空格
COPY 与 ADD:复制文件,优先用 COPY
两者都把宿主机文件或目录复制进镜像,但语义和能力不同:
-
COPY更透明、更安全,仅做复制,推荐日常使用(COPY ./src /app/src) -
ADD支持自动解压 tar 包、从远程 URL 下载(如ADD https://example.com/file.zip /tmp/),但行为隐含、不易追溯,不建议滥用 - 复制单个文件时,目标路径写全(含文件名),复制目录时结尾不加斜杠,避免歧义
CMD:容器默认启动命令,可被覆盖
定义容器启动时执行的默认指令,格式有三种:shell、exec、param,推荐使用 exec 格式(CMD ["node", "server.js"]):
- 一个 Dockerfile 中只能有一个 CMD 生效,后写的会覆盖前面的
- 它不参与构建,只在
docker run时生效;若命令需要参数,可配合ENTRYPOINT使用 - 不要用
CMD service start这类后台服务命令——容器应以前台进程方式运行,否则启动即退出










