如何在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
相关产品推荐
相关产品推荐

