如何在Docker容器内完成Java编译并部署到Web服务器?
可行解决方案
针对你需要在Docker流程中完成Java编译+Tomcat部署的需求,有多种成熟的替代方案,不需要在单个Dockerfile里同时拉取两个独立镜像:
方案1:Docker多阶段构建(首选方案)
Docker原生支持多阶段构建特性,你可以在同一个Dockerfile中定义多个构建阶段,每个阶段可以独立选择基础镜像,最终只保留运行阶段需要的内容即可:
# 阶段1:编译阶段,使用带构建环境的JDK镜像 FROM maven:3.9-openjdk-17 AS build-env WORKDIR /code # 拷贝项目源码到构建容器 COPY . . # 执行编译打包,跳过单元测试可按需调整 RUN mvn clean package -DskipTests # 阶段2:运行阶段,直接使用Tomcat官方镜像 FROM tomcat:10.1-jre17 # 仅从编译阶段拷贝已经打好的war包到Tomcat部署目录 COPY --from=build-env /code/target/*.war /usr/local/tomcat/webapps/ROOT.war # 暴露Tomcat默认端口 EXPOSE 8080 # 启动Tomcat服务 CMD ["catalina.sh", "run"]
该方案的优势是最终镜像仅包含运行时依赖,体积小,且全流程仅需维护一个Dockerfile。
方案2:拆分构建与运行流程
如果暂时不方便使用多阶段构建,也可以分两步完成:
- 第一步:单独启动构建容器完成编译,将产物挂载到本地
执行编译命令:docker run --rm -v $(pwd):/app -w /app maven:3.9-openjdk-17 mvn clean package -DskipTests
执行完成后本地target目录会生成编译好的war包 - 第二步:用编译产物构建Tomcat运行镜像
对应的Dockerfile内容:
执行构建命令:FROM tomcat:10.1-jre17 COPY ./target/*.war /usr/local/tomcat/webapps/ROOT.war EXPOSE 8080 CMD ["catalina.sh", "run"]docker build -t my-java-webapp .
方案3:自定义集成JDK+Tomcat的基础镜像
如果你的场景需要在同一个运行容器内同时保留编译能力,可以自行构建同时安装JDK和Tomcat的自定义基础镜像,后续直接基于该镜像完成源码拷贝、编译、部署的全流程即可。
内容的提问来源于stack exchange,提问作者Swamy Naidu
相关产品推荐
相关产品推荐

