RUN 指令怎么清理安装缓存释放镜像构建产生的垃圾

雨磊大大_1543

雨磊大大_1543

2026-10-28

617人浏览

原创

RUN指令本身不自动清理缓存,必须将安装与清理合并至同一层执行,用&&连接,否则中间缓存会残留于前一层导致镜像虚胖;多阶段构建可彻底规避该问题。

run 指令怎么清理安装缓存释放镜像构建产生的垃圾

RUN 指令本身不会自动清理缓存,它只负责执行命令并把结果固化为一个新层。真正造成“垃圾”的,不是 RUN 本身,而是安装过程中产生的中间文件(如 apt 缓存、源码目录、压缩包等)——它们被写入了某一层,即使后续用 rm 删除,也只在新层里标记“删了”,旧层里的文件依然物理存在。

所以关键不是“怎么在 RUN 里删”,而是怎么让删除动作和安装动作落在同一层里,避免分层残留。

合并安装与清理到单个 RUN 层

必须把下载、解压、编译、安装、清理全部写在同一行 RUN 中,用 && 连接,确保所有操作都在同一个镜像层内完成:

RUN apt-get update && \
    apt-get install -y curl jq && \
    rm -rf /var/lib/apt/lists/*

✅ 正确:apt-get install 和 rm -rf /var/lib/apt/lists/* 在同一 RUN 中 → 缓存只存在于该层内部,最终镜像不包含这些临时文件。
❌ 错误:分开写成两个 RUN:

RUN apt-get update && apt-get install -y curl
RUN rm -rf /var/lib/apt/lists/*   # 这会新增一层,上一层的 lists/ 仍残留

针对不同包管理器的清理写法

包管理器 典型清理命令(需与安装合并)
apt (Debian/Ubuntu) rm -rf /var/lib/apt/lists/*
apk (Alpine) apk --no-cache add 或 && apk del .build-deps && rm -rf /var/cache/apk/*
yum/dnf (CentOS/RHEL) yum clean all && rm -rf /var/cache/yum
pip (Python) pip install --no-cache-dir 或 && pip cache purge

⚠️ 注意:--no-cache-dir 是 pip 的关键参数,否则它会在 /root/.cache/pip 留下大量缓存,且跨层无法清除。

Docker Encyclopedia
Docker Encyclopedia

Docker 文档优先工作流:针对 Docker 特定问题、故障排除、命令规划、镜像/构建、容器/运行时操作及 Compose 等

下载

多阶段构建:彻底绕过 RUN 清理难题

如果安装的是编译型工具(如 gcc、make、node-gyp),又不想把开发环境带进最终镜像,最干净的方式是不用 RUN 清理,而是根本不用保留那层:

# 构建阶段
FROM golang:1.21 AS builder
WORKDIR /app
COPY . .
RUN go build -o myapp .

# 运行阶段(纯净环境)
FROM alpine:latest
RUN apk --no-cache add ca-certificates
COPY --from=builder /app/myapp /usr/local/bin/
CMD ["myapp"]

→ 所有构建依赖都留在 builder 阶段,最终镜像完全不包含任何安装缓存或中间产物。

补充:别指望 .dockerignore 或 rm 单独起作用

  • .dockerignore 只影响构建上下文上传,不影响 RUN 内部生成的文件;
  • 单独 RUN rm xxx 无法删除前一层的内容,只会新增一层“删除记录”;
  • docker system prune 等命令清理的是本地构建缓存和悬空层,不能缩小已构建镜像的体积——那是镜像层结构决定的,必须从 Dockerfile 设计源头解决。

本质上,RUN 清理缓存不是靠“删”,而是靠“不写进去”或“写完立刻在同一层擦掉”。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

docker

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

2026.10.28

40

16

Vite 如何搭配 Vue.js
Vite 如何搭配 Vue.js

Vite搭配Vue.js专题汇集创建Vue 3项目、配置开发环境、路径别名、Vue插件、代理、多环境构建与调试的已审核文章,帮助读者完成从初始化到日常开发的配置。

2026.10.28

20

15

Vite 项目目录怎么看
Vite 项目目录怎么看

Vite项目目录专题汇集入口文件、src源码、public静态资源、路径别名、项目根目录和构建输出目录相关的已审核文章,帮助读者理解各文件夹的用途与引用方式。

2026.10.28

0

10

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

2026.10.22

120

11

Gradle Wrapper配置教程
Gradle Wrapper配置教程

本专题介绍Gradle Wrapper的基本作用,涵盖文件组成、生成方法、版本配置和任务调用,帮助你理解项目如何使用指定的Gradle版本,减少不同开发环境带来的构建差异。

2026.10.22

80

10

Golangci-lint检查器使用教程
Golangci-lint检查器使用教程

本专题整理Golangci-lint常用Linters的用途与配置方法,覆盖错误处理、无效代码、安全、复杂度、命名和依赖检查,帮助项目合理选规则。

2026.10.22

60

15

Gradle怎么构建Java项目
Gradle怎么构建Java项目

本专题介绍Gradle Java项目构建方法,涵盖Java插件配置、依赖声明、源码编译、测试执行和打包检查,帮助你理解各阶段的任务关系,逐步完成项目构建。

2026.10.22

40

10

PHP时间戳漏洞修复教程
PHP时间戳漏洞修复教程

本专题汇总PHP常见时间戳漏洞,包括2038年溢出、时区漂移、时间戳伪造、重放攻击、时间盲注与日志审计失效等,并给出升级64位环境、使用 DateTimeImmutable、统一UTC、严格超时校验、预处理绑定、hash_equals 比对等修复方案,帮助开发者快速排查和加固时间相关代码。

2026.10.22

60

25

Golangci-lint配置文件与规则设置
Golangci-lint配置文件与规则设置

本专题聚焦Golangci-lint YAML配置文件,讲清运行参数、规则启停、目录排除、问题过滤及严重级别设置,便于团队统一检查标准。

2026.10.22

40

15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
phpMyAdmin 安装文档
phpMyAdmin 安装文档

共0课时 | 0人学习

Docker 官方文档
Docker 官方文档

共0课时 | 0人学习

宝塔 Docker 模块使用手册
宝塔 Docker 模块使用手册

共0课时 | 0人学习