基础指令
指令 | 说明 | 示例 | 注意事项 |
---|---|---|---|
FROM | 指定基础镜像 | FROM ubuntu:20.04 |
必须是 Dockerfile 的第一个指令 |
MAINTAINER | 指定维护者信息 | MAINTAINER yourname@email.com |
已被 LABEL 替代,建议使用 LABEL |
LABEL | 为镜像添加元数据 | LABEL version="1.0" |
可以添加多个标签 |
RUN | 执行命令 | RUN apt-get update |
每执行一次都会创建新的镜像层 |
CMD | 容器启动时执行的命令 | CMD ["nginx", "-g", "daemon off;"] |
可以被 docker run 的命令覆盖 |
ENTRYPOINT | 容器启动时执行的命令 | ENTRYPOINT ["nginx"] |
不会被 docker run 的命令覆盖 |
EXPOSE | 声明容器运行时监听的端口 | EXPOSE 80 |
仅声明,不会自动映射端口 |
ENV | 设置环境变量 | ENV PATH=/usr/local/bin |
可以在容器运行时被覆盖 |
ADD | 复制文件到镜像中 | ADD source.txt /app/ |
支持自动解压 tar 文件 |
COPY | 复制文件到镜像中 | COPY source.txt /app/ |
仅支持本地文件复制 |
VOLUME | 创建挂载点 | VOLUME ["/data"] |
用于持久化数据 |
USER | 指定运行容器的用户 | USER nginx |
影响后续的 RUN、CMD 等指令 |
WORKDIR | 设置工作目录 | WORKDIR /app |
影响后续的 RUN、CMD 等指令 |
ARG | 定义构建参数 | ARG VERSION=1.0 |
仅在构建时有效 |
ONBUILD | 触发器指令 | ONBUILD COPY . /app |
在子镜像构建时触发 |
最佳实践
多阶段构建
使用多阶段构建可以减小最终镜像的大小
示例:
1
2
3
4
5
6
7
8FROM golang:1.16 AS builder
WORKDIR /app
COPY . .
RUN go build -o main .
FROM alpine:latest
COPY --from=builder /app/main .
CMD ["./main"]
优化镜像层
- 合并 RUN 指令减少层数
- 使用 .dockerignore 排除不需要的文件
- 示例:
1
2
3RUN apt-get update && \
apt-get install -y nginx && \
rm -rf /var/lib/apt/lists/*
安全性考虑
- 使用非 root 用户运行容器
- 及时更新基础镜像
- 示例:
1
2
3FROM node:alpine
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
USER appuser
常见问题
COPY vs ADD
- COPY 更简单直接,推荐优先使用
- ADD 支持自动解压和远程 URL,但不够透明
CMD vs ENTRYPOINT
- CMD 定义默认命令,可被覆盖
- ENTRYPOINT 定义入口点,通常与 CMD 配合使用
环境变量使用
- 使用 ENV 设置默认环境变量
- 使用 ARG 设置构建时的变量
- 运行时可通过 -e 参数覆盖环境变量