Dockerfile 是一个文本文件,包含了一系列用于构建 Docker 镜像的指令。以下是 Dockerfile 中常见指令的详细解释:
基础指令
1. FROM
指定基础镜像,必须为第一条指令(注释除外)。
FROM ubuntu:20.04
FROM python:3.9-slim
2. LABEL
为镜像添加元数据(键值对)。
LABEL maintainer="your.email@example.com"
LABEL version="1.0"
LABEL description="This is a custom image"
3. ENV
设置环境变量,可在后续指令和容器运行时使用。
ENV APP_HOME=/app
ENV PATH=$PATH:/usr/local/bin
4. WORKDIR
设置工作目录,如果目录不存在会自动创建。
WORKDIR /app
构建过程指令
5. RUN
在构建过程中执行命令,会创建新的镜像层。
RUN apt-get update && apt-get install -y \
curl \
nginx \
&& rm -rf /var/lib/apt/lists/*
6. COPY
将文件从构建上下文复制到镜像中。
COPY . /app
COPY requirements.txt /app/
COPY --from=builder /app/bin /usr/local/bin # 多阶段构建中从其他阶段复制
7. ADD
类似 COPY,但功能更多(自动解压 tar 文件,可从 URL 下载)。
ADD https://example.com/file.tar.gz /tmp/
ADD file.tar.gz /tmp/ # 会自动解压
容器运行时指令
8. CMD
指定容器启动时的默认命令(可被 docker run
覆盖)。
CMD ["nginx", "-g", "daemon off;"] # 推荐使用 exec 格式
CMD echo "Hello World" # shell 格式
9. ENTRYPOINT
配置容器启动时运行的命令(不易被覆盖)。
ENTRYPOINT ["/app/start.sh"]
10. EXPOSE
声明容器运行时监听的端口(不会自动映射)。
EXPOSE 80
EXPOSE 443
其他重要指令
11. ARG
定义构建时的变量(构建后不再存在)。
ARG VERSION=latest
FROM ubuntu:$VERSION
12. VOLUME
创建挂载点,用于持久化数据。
VOLUME /data
13. USER
指定运行后续指令的用户(和用户组)。
USER nobody
USER 1000:1000
14. HEALTHCHECK
定义容器健康检查。
HEALTHCHECK --interval=30s --timeout=3s \
CMD curl -f http://localhost/ || exit 1
15. ONBUILD
添加触发器,当本镜像作为基础镜像时执行。
ONBUILD COPY . /app/src
ONBUILD RUN make /app/src
多阶段构建
16. 多阶段构建
减少最终镜像大小,只保留必要的文件。
FROM golang:1.16 AS builder
WORKDIR /go/src/app
COPY . .
RUN go build -o /go/bin/app
FROM alpine:latest
COPY --from=builder /go/bin/app /usr/local/bin/app
CMD ["app"]
最佳实践
- 合并 RUN 指令:减少镜像层数
- 使用 .dockerignore:排除不必要的文件
- 选择合适的基础镜像:如 alpine 版本更小
- 清理缓存:如
apt-get
的/var/lib/apt/lists/
- 指定版本标签:避免使用
latest
示例 Dockerfile
# 多阶段构建示例
FROM node:14 AS build
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
FROM nginx:alpine
COPY --from=build /app/dist /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
理解这些指令后,你可以根据需要编写高效的 Dockerfile 来构建优化的 Docker 镜像。