概述Dockerfile 是一个文本文件,包含了构建 Docker 镜像所需的所有命令。Docker 通过读取 Dockerfile 中的指令自动构建镜像。本文档详细介绍了 Dockerfile 的格式和支持的指令。
Dockerfile 必须以大写 D 开头命名为 Dockerfile,除非使用 -f 参数指定其他文件名。基本结构Dockerfile 由一系列指令和参数组成。每条指令都必须大写,后面跟随相应的参数。
# 注释
FROM ubuntu:20.04
LABEL maintainer="your-email@example.com"
RUN apt-get update && apt-get install -y nginx
COPY . /app
WORKDIR /app
CMD ["nginx", "-g", "daemon off;"]Copy code基础指令FROM指定基础镜像,是 Dockerfile 中必须存在的第一条指令。
语法FROM 指令支持以下几种格式:
FROM
FROM
FROM
语法WORKDIR /path/to/workdirCopy codeCOPY从构建上下文复制文件或目录到容器中。
语法COPY [--chown=
COPY [--chown=
语法ADD [--chown=
ADD [--chown=
语法RUN 指令支持 shell 格式和 exec 格式:
# Shell 格式
RUN command
# Exec 格式
RUN ["executable", "param1", "param2"]Copy codeCMD指定容器启动时要运行的命令。一个 Dockerfile 中只能有一个 CMD 指令。如果指定了多个,只有最后一个会生效。
语法CMD 指令支持三种格式:
# Exec 格式(推荐)
CMD ["executable","param1","param2"]
# 作为 ENTRYPOINT 的默认参数
CMD ["param1","param2"]
# Shell 格式
CMD command param1 param2Copy codeENTRYPOINT配置容器启动时运行的可执行文件。ENTRYPOINT 的主要用途是将容器作为可执行程序使用。
语法# Exec 格式(推荐)
ENTRYPOINT ["executable", "param1", "param2"]
# Shell 格式
ENTRYPOINT command param1 param2Copy code环境和参数ENV设置环境变量,这些变量在构建过程中和容器运行时都可用。
语法ENV
ENV
语法ARG
语法LABEL
FROM golang:1.21 AS builder
WORKDIR /app
COPY . .
RUN go build -o main
FROM alpine:latest
COPY --from=builder /app/main /main
CMD ["/main"]Copy code合并 RUN 指令合并多个 RUN 指令可以减少镜像层数,从而减小镜像大小。使用 && 连接多个命令,并在最后清理缓存。
RUN apt-get update && apt-get install -y package1 package2 && rm -rf /var/lib/apt/lists/*Copy code使用 .dockerignore使用 .dockerignore 文件排除不需要的文件,可以加快构建速度并减小构建上下文的大小。
node_modules
npm-debug.log
Dockerfile
.dockerignore
.git
.gitignoreCopy code选择合适的基础镜像使用官方镜像,优先选择 alpine 版本以减小镜像大小。确保使用具体的标签而不是 latest。
FROM node:18-alpineCopy code完整示例Node.js 应用示例# 使用 Node.js Alpine 作为基础镜像
FROM node:18-alpine
# 设置工作目录
WORKDIR /app
# 复制 package.json 和 package-lock.json
COPY package*.json ./
# 安装依赖
RUN npm ci --only=production
# 复制源代码
COPY . .
# 暴露端口
EXPOSE 3000
# 启动应用
CMD ["npm", "start"]Copy codeGo 应用多阶段构建示例# 构建阶段
FROM golang:1.21-alpine AS builder
WORKDIR /app
# 复制 Go 模块文件
COPY go.* ./
RUN go mod download
# 复制源代码
COPY . .
# 构建应用
RUN CGO_ENABLED=0 GOOS=linux go build -o main
# 运行阶段
FROM alpine:latest
RUN apk --no-cache add ca-certificates
WORKDIR /root/
# 从构建阶段复制二进制文件
COPY --from=builder /app/main .
# 运行应用
CMD ["./main"]Copy code