Dockerfile 是定义镜像构建过程的脚本。掌握常用指令你可以将任何应用打包成可复用的镜像。本文从最基础的 FROM、RUN、COPY、ADD 开始详细讲解每个指令的语法、最佳实践和常见陷阱。一、Dockerfile 基础概念Dockerfile 是一个文本文件包含一系列指令每条指令构建镜像的一层。Docker 会按顺序执行这些指令并缓存中间层以加速后续构建。构建命令dockerbuild-tmyimage:tag.-t指定镜像名称和标签。.构建上下文当前目录Docker 会将此目录下的文件发送给 Docker 守护进程。二、FROM指定基础镜像语法dockerfileFROM [–platform] [:] [AS ]作用所有 Dockerfile 必须以 FROM 开头除了 ARG 指令。它定义了构建起点。最佳实践优先选择官方镜像如 alpine、ubuntu、node:18-alpine。明确指定 tag避免 latest不可预测。多阶段构建时使用 AS 命名阶段。示例dockerfileFROM alpine:3.18FROM node:18-alpine AS builderFROM scratch # 用于构建极简镜像三、RUN执行命令语法dockerfileshell 形式默认 /bin/sh -cRUNexec 形式推荐避免 shell 解析问题RUN [“executable”, “param1”, “param2”]作用在构建过程中运行命令通常用于安装软件包、编译代码、设置权限等。每一条 RUN 会创建新的一层。最佳实践将多个 RUN 命令合并为一条使用 连接减少镜像层数。清理临时文件如 apt-get clean、rm -rf /var/lib/apt/lists/*在同一层进行避免残留。示例dockerfile不推荐多层RUN apt-get updateRUN apt-get install -y curlRUN rm -rf /var/lib/apt/lists/*推荐合并RUN apt-get update apt-get install -y curl rm -rf /var/lib/apt/lists/*四、COPY复制文件语法dockerfileCOPY [–chown:] 源路径… 目标路径COPY [–chown:] [“源路径”,… “目标路径”] # 路径含空格时使用作用将构建上下文中的文件/目录复制到镜像中。特点源路径必须是构建上下文内的相对路径。目标路径可以是绝对路径或相对于 WORKDIR 的相对路径。支持通配符*、?。自动创建目标路径中不存在的目录。最佳实践优先使用 COPY除非需要自动解压ADD 的特权。指定 --chown 以设置正确的文件所有者避免权限问题。复制时注意 .dockerignore 文件排除无用内容。示例dockerfileCOPY . /app # 复制所有文件到 /appCOPY --chownnode:node package.json /app/COPY *.txt /app/data/五、ADD增强版 COPY语法同 COPY但额外支持源路径可以是 URL自动下载。源路径若是 tar 压缩包.tar、.tar.gz 等自动解压到目标路径。示例dockerfileADD https://example.com/file.tar.gz /tmp/ # 下载并解压ADD app.tar.gz /usr/local/ # 自动解压注意官方建议除非需要自动解压否则使用 COPY。因为 ADD 的 URL 下载和自动解压行为不够透明且无法利用缓存。从 URL 下载的文件不会被缓存除非文件内容和 URL 完全不变可能影响构建速度。六、构建上下文与 .dockerignore构建上下文执行 docker build 时指定路径下的所有文件都会被压缩发送给 Docker 守护进程。如果目录很大构建会变慢。.dockerignore类似 .gitignore用于排除不需要的文件例如textnode_modules/*.log.git/.DS_Store七、综合示例构建一个 Node.js 应用镜像dockerfile使用 Node.js 18 Alpine 作为基础镜像FROM node:18-alpine AS builder设置工作目录WORKDIR /app复制 package.json 和 package-lock.json先复制依赖文件利用缓存COPY package*.json ./安装依赖RUN npm ci --onlyproduction复制应用代码COPY . .多阶段构建运行时镜像FROM node:18-alpineWORKDIR /app从 builder 阶段复制依赖和代码COPY --frombuilder /app/node_modules ./node_modulesCOPY --frombuilder /app /app暴露端口EXPOSE 3000启动应用CMD [“node”, “server.js”]构建命令dockerbuild-tmy-node-app.八、常见问题与解决九、小结FROM 定义基础镜像RUN 执行构建命令COPY 和 ADD 复制文件。熟练掌握这些指令你已经能编写大多数应用的 Dockerfile。核心优化原则选择合适的基础镜像Alpine 优先。合并 RUN 命令以减少层数。利用构建缓存将变动频率低的指令前置。使用 .dockerignore 排除无关文件。