关键是在单条 RUN 指令中用 && 串联命令并配合 set -eux 和反斜杠换行,实现“安装→使用→清理”闭环,避免多层残留;结合多阶段构建进一步精简最终镜像。

关键不是写独立的 Shell 脚本,而是在 RUN 指令中高效组织 shell 命令——用 && 连接、反斜杠换行、配合 set -eux,把多个逻辑步骤压进单一层。
用 && 串联命令并及时清理
每条 RUN 对应一个镜像层,中间生成的临时文件(如 apt 缓存、源码包、构建产物)如果在不同 RUN 中操作,就会残留为不可见但实际存在的层。必须在同一条 RUN 中完成“安装→使用→清理”闭环:
RUN apt-get update && apt-get install -y --no-install-recommends curl nginx && rm -rf /var/lib/apt/lists/*RUN apk add --no-cache git make && git clone https://... && make build && cp ./bin/app /usr/local/bin/ && rm -rf /root/src- 避免拆成多条 RUN:那样
rm -rf只是新增一层“标记删除”,原文件仍在前一层里
加 set -eux 提升健壮性与可读性
直接写长命令链容易出错且难调试。推荐在 RUN 开头显式启用 shell 选项:
RUN set -eux; apt-get update && apt-get install ...-
set -e:任一命令失败立即退出,不继续执行(防止部分成功导致状态不一致) -
set -u:引用未定义变量时报错,避免静默错误 -
set -x:打印实际执行的命令,便于构建日志排查
用反斜杠换行提升可维护性
过长的单行 RUN 不易阅读和修改。可用 \ 换行,Docker 会自动拼接为一条命令:
-
正确写法:
RUN set -eux \<br>&& apt-get update \<br>&& apt-get install -y --no-install-recommends \<br> curl \<br> wget \<br>&& rm -rf /var/lib/apt/lists/*
- 注意:每行末尾的
\后不能有空格,否则报错 - 换行只是格式优化,最终仍为单层、单次 shell 执行
结合多阶段构建进一步精简
即使 RUN 内部再干净,如果基础镜像含大量工具(如 golang:1.22),整个构建阶段仍会带来冗余层。应配合多阶段构建:
- 构建阶段专注编译:用完整镜像,RUN 多条命令合并没问题
- 运行阶段只 COPY 产物:FROM alpine 或 scratch,再 RUN 就只剩 1–2 层
- COPY --from=builder 不继承源层,所以构建阶段再臃肿也不影响最终层数


















