镜像里的 apt 安装
在 Debian、Ubuntu 系基础镜像里装包走 apt-get:更新索引、安装、清理列表三步必须写进同一条 RUN。分开放会把索引固化进镜像层,后续安装可能命中过期索引,还会把几十 MB 的包列表一直留在镜像里。
基本信息
| 要点 | apt-get update 与 install 写在同一层,随后清理索引 |
|---|---|
| 减小体积 | --no-install-recommends 过滤掉推荐包 |
| 清理动作 | rm -rf /var/lib/apt/lists/* |
| 健壮性 | 开头加 set -eux,任一步失败立即中断构建 |
| 非交互 | 先装 tzdata 或设置 DEBIAN_FRONTEND,避免交互提示卡住 |
典型使用场景
- 给运行时镜像补 ca-certificates、tzdata 这类基础组件
- 编译阶段装 gcc、make、python3-dev 等构建工具,最终镜像不带走
- 排障镜像里装 curl、netcat、strace,方便进容器查问题
- 安装图形库、字体类依赖时用 --no-install-recommends 压掉无关包
- 内网构建换成本地镜像源,缩短每次构建的下载时间
示例
示例
RUN set -eux; \
apt-get update; \
apt-get install -y --no-install-recommends ca-certificates curl tzdata; \
rm -rf /var/lib/apt/lists/*几种写法的差别
| 写法 | 效果 | 带来的问题 |
|---|---|---|
| update 与 install 同一 RUN | 索引与安装同层,清理后不留列表 | 推荐写法,无额外体积 |
| update 单独一层 | 索引被固化进镜像层 | 后续 install 可能命中过期索引,报包不存在 |
| 不清理包列表 | 少一条删除命令 | 镜像长期多出几十 MB |
| 省掉 --no-install-recommends | 少写一个参数 | 带进大量推荐包,体积与风险面同时上升 |
清理包列表后镜像里就没有索引了,运行期再执行 apt-get install 会失败;调试镜像可以暂时不清理,生产镜像保持清理习惯。
不要在构建里用 apt-get upgrade 整体升级:包与基础镜像的版本组合不再可控,构建结果随时间漂移,安全补丁应当通过更新基础镜像获得。
Debian 与 Ubuntu 的包名大体一致,但依赖关系与默认版本不同,从一种镜像复制安装命令到另一种之前先跑一次构建验证。