记录发布Dockerfile的写法

48 阅读2分钟

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设置工作目录,后续RUNCMDCOPY等都在此目录下执行。
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"]