📘 什么是 Dockerfile?

Dockerfile 是一个文本文件,包含一系列指令,定义了如何构建一个 Docker 镜像。Docker 引擎通过读取这些指令,逐步构建出镜像。每条指令都会创建一个新的镜像层。

🧱 常用指令概览

以下是 Dockerfile 中常用的指令及其作用:

指令

功能描述

FROM

指定基础镜像,必须是 Dockerfile 的第一条指令。

RUN

在构建镜像时执行命令。

CMD

指定容器启动时默认执行的命令。

LABEL

添加元数据到镜像中。

EXPOSE

声明容器运行时监听的端口。

ENV

设置环境变量。

ADD

将文件、目录或远程文件添加到镜像中。

COPY

将文件或目录复制到镜像中。

ENTRYPOINT

配置容器启动时执行的主命令。

VOLUME

创建挂载点,以便在容器之间共享数据。

USER

指定运行容器时的用户。

WORKDIR

设置后续指令的工作目录。

ARG

定义构建时的变量。

ONBUILD

为后续继承的镜像设置触发指令。

HEALTHCHECK

定义容器的健康检查指令。

SHELL

指定后续 RUNCMDENTRYPOINT 的默认 shell。

🛠️ 构建流程与示例

一个典型的 Dockerfile 示例:

# 使用官方 Python 3.12 镜像作为基础
FROM python:3.12

# 设置工作目录
WORKDIR /usr/src/app

# 复制依赖文件并安装
COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt

# 复制应用代码
COPY . .

# 指定容器启动时执行的命令
CMD ["python", "app.py"]

构建镜像的命令:

docker build -t my-python-app .

运行容器的命令:

docker run -d -p 8000:8000 my-python-app

🧩 多阶段构建(Multi-stage Builds)

多阶段构建允许在一个 Dockerfile 中使用多个 FROM 指令,分别定义不同的构建阶段,从而减小最终镜像的体积。例如:

# 第一阶段:构建应用
FROM golang:1.20 AS builder
WORKDIR /app
COPY . .
RUN go build -o myapp

# 第二阶段:创建精简运行环境
FROM alpine:latest
WORKDIR /root/
COPY --from=builder /app/myapp .
CMD ["./myapp"]

这种方式可以避免将构建工具和中间文件包含在最终镜像中,提高安全性和效率。

🧠 最佳实践

  • 固定基础镜像版本:使用具体的版本标签(如 python:3.12),避免因镜像更新导致构建结果不一致。

  • 利用缓存:将不频繁变动的指令(如安装依赖)放在前面,以便 Docker 利用缓存加速构建。

  • 最小化镜像体积:使用多阶段构建和精简的基础镜像(如 alpine)来减小镜像大小。

  • 避免在镜像中存储敏感信息:不要在 Dockerfile 中硬编码密码、密钥等敏感数据。

  • 清理临时文件:在构建过程中删除不必要的文件,减少镜像体积。

📚 参考资料