Dockerfile中RUN安装依赖需兼顾干净、可复现与体积小:合并更新、安装、清理于单个RUN;按用途分组隔离依赖;关键包固定版本;Python用pinned requirements.txt。
dockerfile 通过 run 指令执行安装命令来构建依赖包,本质是在镜像构建过程中启动临时容器、运行命令、提交结果为新镜像层。关键不是“能不能装”,而是“怎么装得干净、可复现、体积小”。
用 RUN 安装依赖的基本写法
最简形式是直接调用包管理器:
- Debian/Ubuntu:
RUN apt-get update && apt-get install -y curl wget - CentOS/RHEL:
RUN yum install -y epel-release && yum install -y nginx - Alpine:
RUN apk add --no-cache curl wget
但这样写仅适用于测试,生产环境必须优化。
必须合并安装与清理(单层完成)
避免缓存残留和镜像膨胀,所有操作应放在同一个 RUN 中,用 && 连接,确保原子性:
- Debian/Ubuntu 示例:
RUN apt-get update && \apt-get install -y --no-install-recommends libpq5 curl && \apt-get clean && \rm -rf /var/lib/apt/lists/* - CentOS 示例(yum v4+):
RUN yum install -y --setopt=install_weak_deps=False nginx && yum clean all - Alpine 已内置清理:
RUN apk add --no-cache git make
按用途分组依赖,不混装
不同阶段的依赖要物理隔离,提升缓存复用率和安全性:
- 基础工具(curl、tar、ca-certificates)放早期 RUN 层,供后续复用
- 构建时依赖(gcc、python3-dev、cmake)只出现在 multi-stage 的 builder 阶段,不进入最终镜像
- 运行时依赖(libssl1.1、libglib-2.0-0)单独安装,禁用
-dev或-devel包
关键依赖固定版本,保障可重现
不写死版本容易因源更新导致构建结果不一致,尤其对安全或 ABI 敏感的包:
- Ubuntu:
apt-get install -y libpq5=14.12-0ubuntu0.22.04.1 - Alpine:
apk add --no-cache nginx=1.24.0-r3 - Python 包建议配合 requirements.txt 使用
--no-cache-dir和 pinned 版本
不复杂但容易忽略


















