如何在Azure DevOps Pipeline中构建含构建产物的Docker镜像
单流水线完成Java代码构建与Docker镜像打包方案
方案1:Docker多阶段构建(无需额外处理产物传递)
这个方案把Java构建和镜像打包的逻辑全封装在Dockerfile内,仅需一次构建命令即可完成全流程,不需要流水线单独处理产物传递。
Dockerfile示例:
# 构建阶段:使用带Maven的JDK镜像完成代码编译打包 FROM maven:3.8.6-openjdk-11 AS builder WORKDIR /build # 优先拷贝依赖配置文件,利用Docker层缓存避免每次构建重新下载依赖 COPY pom.xml . RUN mvn dependency:go-offline -B # 拷贝源码执行构建 COPY src ./src RUN mvn clean package -DskipTests -q # 运行阶段:仅保留运行环境和最终jar包,缩小镜像体积 FROM openjdk:11-jre-slim WORKDIR /app # 从构建阶段直接拷贝生成好的jar包 COPY --from=builder /build/target/*.jar ./application.jar # 配置启动命令 ENTRYPOINT ["java", "-jar", "application.jar"]
你只需在流水线中执行docker build -t <镜像名>:<版本号> .,即可直接完成从源码到可运行Docker镜像的全流程。
方案2:流水线分步骤执行(适合需单独留存jar产物的场景)
如果你需要单独保存构建生成的jar包,可按顺序执行流水线步骤,同一次流水线任务的工作空间默认是共享的,不需要额外配置产物传递:
- 步骤1:拉取项目源码到流水线工作目录
- 步骤2:执行Java构建命令生成jar包:
mvn clean package -DskipTests,构建完成后jar包默认生成在工作目录的target/路径下 - 步骤3:使用匹配路径的Dockerfile执行镜像构建,Dockerfile示例:
FROM openjdk:11-jre-slim WORKDIR /app COPY ./target/*.jar ./application.jar ENTRYPOINT ["java", "-jar", "application.jar"]
- 步骤4:执行镜像构建命令:
docker build -t <镜像名>:<版本号> .
注意:如果你的流水线使用Docker in Docker模式执行构建,需要确认执行docker build的步骤挂载了流水线的工作目录,否则会出现找不到jar包的问题
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

