首页/云/Docker 容器速查/Debian/Ubuntu 镜像中的 apt 安装
镜像与构建107 条

Debian/Ubuntu 镜像中的 apt 安装

apt 安装的常规写法:更新索引、安装、马上清理索引,全部放进同一条 RUN;--no-install-recommends 控制多余包。

Docker 容器速查云更新于 2026-10-13

镜像里的 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 的包名大体一致,但依赖关系与默认版本不同,从一种镜像复制安装命令到另一种之前先跑一次构建验证。

易错点

  • apt-get update 与 install 分成两条 RUN,缓存命中旧索引时报 404 或装到旧版本,换过镜像源之后尤其常见
  • 忘记 rm -rf /var/lib/apt/lists/* 会让镜像多出几十 MB,而且每次构建都带着
  • tzdata 这类包安装时可能弹出交互选择,非交互构建里卡住或被默认值带偏,要提前设好环境变量
  • 多阶段构建时把编译工具装进了最终镜像,体积明显增大,工具应当装在构建阶段
  • 构建机走公司代理时 apt 需要单独配代理(Acquire::http::Proxy 或环境变量),只给 docker 守护进程配代理不会自动作用于容器内的 apt

数据来源与参考

  • Docker 官方文档:Best practices(docs.docker.com)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌