如何实现Docker多阶段构建逻辑复用 避免多Dockerfile重复编码
问题解答
Docker本身完全支持该需求,你可以把任意镜像(包括其他Dockerfile构建产出的非最终中间阶段镜像)作为新构建阶段的起点使用,以下是具体的改造方案:
步骤1:抽离公共逻辑为独立Dockerfile
把两个Dockerfile中重复的prebuilder逻辑和run-stage公共逻辑抽为单独的Dockerfile.common:
FROM debian:stretch as prebuilder # 原prebuilder阶段的所有公共逻辑,如安装编译依赖、全局配置等 FROM prebuilder as run-base # 原run-stage阶段的所有公共逻辑,如安装运行时依赖、创建运行用户、设置工作目录、配置环境变量等
步骤2:构建公共阶段镜像并打标签
执行构建命令,把需要复用的两个中间阶段单独打包为可引用的镜像:
# 构建prebuilder阶段并打标签 docker build --target prebuilder -t common/prebuilder:v1 -f Dockerfile.common . # 构建运行时基础阶段并打标签 docker build --target run-base -t common/run-base:v1 -f Dockerfile.common .
步骤3:简化业务应用的Dockerfile
改造后的两个业务Dockerfile只需要保留各自独有的构建、复制逻辑即可:
Dockerfile(应用1)
# 直接复用公共prebuilder镜像作为构建起点 FROM common/prebuilder:v1 as build-stage # 仅保留应用1独有的构建逻辑 RUN # 应用1的编译、打包命令 # 直接复用公共运行时基础镜像 FROM common/run-base:v1 # 仅复制应用1的构建产物即可 COPY --from=build-stage /path/to/app1/binary /usr/local/bin/ # 若有应用1独有的运行配置可在此补充,无则直接结束
Dockerfile(应用2)
# 直接复用公共prebuilder镜像作为构建起点 FROM common/prebuilder:v1 as build-stage # 仅保留应用2独有的构建逻辑 RUN # 应用2的编译、打包命令 # 直接复用公共运行时基础镜像 FROM common/run-base:v1 # 仅复制应用2的构建产物即可 COPY --from=build-stage /path/to/app2/binary /usr/local/bin/ # 若有应用2独有的运行配置可在此补充,无则直接结束
额外说明
- 公共阶段镜像只需构建一次,后续所有业务应用的构建都可以直接复用,既消除了代码重复,还能大幅提升构建效率
- 公共阶段镜像可以推送到私有镜像仓库,跨机器、跨环境复用
- 如果你使用Docker Buildx Bake来管理构建流程,还可以在配置文件中定义阶段依赖,无需手动执行公共镜像的构建命令,Docker会自动处理构建顺序
内容的提问来源于stack exchange,提问作者Carpetfizz
相关产品推荐
相关产品推荐

