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

如何在Dockerfile中用Glob模式复制任意版本的WAR包到Tomcat容器

解决方案:Dockerfile中兼容多版本格式的WAR包复制

方案1:通过Maven固定构建产物名称(推荐)

直接在项目的pom.xml中配置finalName,让Maven构建时生成的WAR包和输出目录不带版本号,彻底规避版本格式的问题:

<project>
  <!-- 其他配置 -->
  <build>
    <!-- 固定最终构建产物的名称,不会包含版本号 -->
    <finalName>STUDENT_MANAGER</finalName>
  </build>
</project>

之后Dockerfile里就可以用固定路径复制,无需处理版本号:

COPY STUDENT_MANAGER/target/STUDENT_MANAGER.war /opt/tomcat/webapps/

这个方案最可靠,不受版本格式(如x.xx、xx.xx)影响,构建产物路径完全固定。

方案2:使用宽松的Shell风格Glob匹配

Docker的COPY指令支持Shell风格的Glob模式,你可以用更宽泛的匹配规则覆盖多种版本格式:

  • 匹配所有以STUDENT_MANAGER-开头的目录下的WAR包:
COPY STUDENT_MANAGER/target/STUDENT_MANAGER-*/STUDENT_MANAGER-*.war /opt/tomcat/webapps/
  • 如果target目录下只有你需要的这一个WAR包(无其他冗余产物),可以直接匹配所有子目录的WAR包:
COPY STUDENT_MANAGER/target/**/*.war /opt/tomcat/webapps/

注意:如果target下存在其他WAR包,这个规则会一并复制,需确保构建产物唯一。

方案3:多阶段构建中用Shell命令辅助匹配

如果无法修改pom.xml,可以在多阶段构建的编译阶段,用Shell命令定位WAR包并复制到临时位置,再传递到Tomcat阶段:

# 第一阶段:编译构建项目
FROM maven:3.8.6-openjdk-11 AS builder
COPY . /app
WORKDIR /app
RUN mvn clean package -DskipTests

# 第二阶段:复制WAR包到Tomcat容器
FROM tomcat:9.0-jdk11-openjdk
# 直接匹配所有带版本前缀的WAR包,无需关注具体版本格式
COPY --from=builder /app/STUDENT_MANAGER/target/STUDENT_MANAGER-*.war /opt/tomcat/webapps/

或者如果WAR包在带版本号的子目录里,可以用Shell命令先拷贝到统一位置:

FROM maven:3.8.6-openjdk-11 AS builder
COPY . /app
WORKDIR /app
RUN mvn clean package -DskipTests && \
    # 找到目标WAR包并复制到临时目录
    cp STUDENT_MANAGER/target/STUDENT_MANAGER-*/STUDENT_MANAGER-*.war /tmp/STUDENT_MANAGER.war

FROM tomcat:9.0-jdk11-openjdk
COPY --from=builder /tmp/STUDENT_MANAGER.war /opt/tomcat/webapps/

内容的提问来源于stack exchange,提问作者Nainesh Goel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 11:42:23