如何让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,提问作者無名前
相关产品推荐
相关产品推荐

