You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让Podman/Docker不再重复构建多阶段构建的Builder步骤?

解决Podman/Docker多阶段构建重复执行Builder阶段依赖安装的问题

针对你遇到的调试final阶段时每次都要重新跑yum安装的问题,可以通过以下几种方法优化:

1. 调整Dockerfile指令顺序,最大化利用构建缓存

Docker/Podman的缓存机制是从上到下匹配指令,如果某一层的指令或上下文内容变化,后续所有层都会重新构建。你当前的Dockerfile先执行了ADD . /build,只要代码目录里的文件有变化,后面所有的yum安装步骤都会失效缓存。

修改Builder阶段的指令顺序,把不频繁变化的依赖安装步骤放在最前面,最后再添加代码:

FROM almalinux:8 AS builder

WORKDIR /build
# 先执行所有系统依赖安装,这些指令几乎不会变动,优先复用缓存
RUN dnf install -y yum-utils dnf-plugins-core
RUN yum install -y epel-release
RUN dnf config-manager --set-enabled powertools
RUN yum install -y gcc gcc-c++ cmake3 make
RUN yum install -y git libpcap-devel
RUN yum module -y install go-toolset
# 最后添加本地代码,只有代码变化时才会触发后续步骤重新执行
ADD . /build
RUN ./install.sh

这样只要yum相关的指令没改,这些安装步骤就会直接用缓存,只有代码更新时才会重新运行./install.sh。

2. 单独构建并重用Builder阶段镜像

如果Final阶段需要频繁调试修改,可以先单独构建好Builder阶段的镜像,之后直接引用这个本地镜像,避免每次重新构建依赖:

步骤1:单独构建Builder阶段

执行以下命令,只构建到Builder阶段并保存为本地镜像:

podman build --target builder -t my-project-builder .

步骤2:修改Final阶段引用本地镜像

修改Dockerfile的Final阶段,直接从刚才构建好的本地镜像复制产物:

# Final smaller image
FROM almalinux:8
# 替换为你实际需要复制的产物路径
COPY --from=my-project-builder /build/your-output-dir /app
# 后续的Final阶段指令...

之后调试Final阶段时,直接运行podman build .就会跳过Builder阶段的构建,直接使用已有的my-project-builder镜像。

3. 维护构建缓存的注意事项

  • 不要在RUN指令中加入动态内容(比如带时间戳的参数),否则会导致缓存失效;
  • 尽量把变化频率低的指令放在Dockerfile的前面,变化频率高的放在后面;
  • 如果需要清理yum缓存减小镜像体积,可以在同一个RUN指令里执行安装和清理,避免额外的镜像层,同时不影响缓存:
    RUN dnf install -y yum-utils dnf-plugins-core && \
        dnf clean all && rm -rf /var/cache/dnf
    

内容的提问来源于stack exchange,提问作者無名前

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 08:01:22