Dockerfile 是用于构建 Docker 镜像的文本文件,它包含一系列指令(instructions),每条指令对应镜像构建过程中的一个步骤。下面是一个标准、清晰、高效的 Dockerfile 写法指南,包括常用指令、最佳实践和示例。
指定基础镜像(必须放在第一行)
FROM [:]
维护者信息(可选,旧版用法,现在推荐用 LABEL)
LABEL maintainer="your@email.com"
设置工作目录
WORKDIR /app
复制文件到镜像中
COPY . .
安装依赖(示例:Node.js 项目)
RUN npm install
暴露端口(仅声明,不实际打开)
EXPOSE 3000
设置环境变量
ENV NODE_ENV=production
启动容器时运行的命令
CMD ["npm", "start"]
| 指令 | 说明 |
|---|---|
| FROM | 指定基础镜像,必须是第一条非注释指令。建议使用具体 tag(如node:18-alpine),避免使用latest。 |
| RUN | 执行命令并创建新镜像层(如安装软件包)。建议合并多个命令以减少层数(用&& 连接)。 |
| COPY | 从本地上下文复制文件/目录到镜像中。比ADD更透明(ADD有自动解压等“魔法”行为,不推荐)。 |
| ADD | 类似COPY,但支持 URL 和自动解压 tar 文件(一般用COPY+RUN tar更明确)。 |
| WORKDIR | 设置工作目录,后续RUN、CMD、COPY等都在此目录下执行。 |
| ENV | 设置环境变量,可用于配置或路径。 |
| EXPOSE | 声明容器运行时监听的端口(仅文档作用,实际需docker run -p映射)。 |
| VOLUME | 创建挂载点,用于持久化数据或共享数据。 |
| CMD | 容器启动时默认执行的命令(可被docker run后的参数覆盖)。推荐使用exec 格式:["executable", "param1", "param2"]。 |
| ENTRYPOINT | 容器启动时执行的主命令(不会被覆盖,CMD会作为其参数)。常用于封装脚本。 |
搞一个示例
FROM node:18-alpine
# 设置工作目录
WORKDIR /app
# 复制依赖清单(利用缓存)
COPY package*.json ./
# 安装生产依赖
RUN npm ci --only=production && npm cache clean --force
# 创建非 root 用户
RUN addgroup -g 1001 -S nodejs && \
adduser -S nextjs -u 1001
USER nextjs
# 复制应用代码
COPY --chown=nextjs:nodejs . .
# 声明端口
EXPOSE 3000
# 启动应用
CMD ["node", "server.js"]