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

使用tomcat:9构建Java应用Docker镜像时遇target目录不存在错误

解决Docker构建Tomcat镜像时的target目录不存在问题

问题场景

使用tomcat:9.0镜像构建Java应用Docker镜像时,出现如下错误:

ERROR: failed to solve: lstat /var/lib/docker/tmp/buildkit-mount3438055024/target: no such file or directory

对应的Dockerfile和错误日志如下:

原Dockerfile

FROM tomcat:9.0

LABEL "project"="java_app"
LABEL "author"="vikas"

# 删除默认的ROOT web应用
RUN rm -rf /usr/local/tomcat/webapps/ROOT

# 将war文件复制到Docker容器的webapps目录
COPY target/*.war var/lib/tomcat9/webapps/

# 暴露tomcat默认端口
EXPOSE 8080

# 容器启动时启动tomcat
CMD ["catalina.sh","run"]

错误日志

CACHED [2/3] RUN rm -rf /usr/local/tomcat/webapps/ROOT               0.0s
 => ERROR [3/3] COPY target/*.war var/lib/tomcat9/webapps/               0.1s
------
 > [3/3] COPY target/*.war var/lib/tomcat9/webapps/:
------
Dockerfile:11
--------------------
   9 |
  10 |     # 将war文件复制到Docker容器的webapps目录
  11 | >>> COPY target/*.war var/lib/tomcat9/webapps/
  12 |
  13 |     # 暴露tomcat默认端口
--------------------
ERROR: failed to solve: lstat /var/lib/docker/tmp/buildkit-mount3438055024/target: no such file or directory

问题原因

  1. 本地未生成WAR包:Java项目未执行Maven/Gradle打包命令,导致根目录下没有target文件夹及WAR文件。
  2. 构建上下文错误:执行docker build时的工作目录不是项目根目录,或者指定的上下文路径不包含target目录。
  3. 容器内路径错误:tomcat:9.0镜像的默认webapps目录是/usr/local/tomcat/webapps/,原Dockerfile中写的var/lib/tomcat9/webapps/是错误路径,且缺少开头的/会导致相对路径解析错误。

修复方案

1. 先生成WAR包

在Java项目根目录执行打包命令:

  • Maven项目:
    mvn clean package -DskipTests
    
  • Gradle项目:
    gradle clean build -x test
    

执行完成后,项目根目录会生成target文件夹,里面包含打包好的WAR文件。

2. 修正Dockerfile

修改COPY指令的目标路径为tomcat镜像的正确目录,同时可将WAR包重命名为ROOT.war(方便直接通过根路径访问):

FROM tomcat:9.0

LABEL "project"="java_app"
LABEL "author"="vikas"

# 删除默认的ROOT web应用
RUN rm -rf /usr/local/tomcat/webapps/ROOT

# 将war文件复制到Docker容器的正确webapps目录
COPY target/*.war /usr/local/tomcat/webapps/ROOT.war

# 暴露tomcat默认端口
EXPOSE 8080

# 容器启动时启动tomcat
CMD ["catalina.sh","run"]

3. 正确执行构建命令

确保在项目根目录(包含target和Dockerfile的目录)执行构建:

docker build -t java_app_tomcat .

末尾的.表示以当前目录作为Docker构建上下文,确保Docker能找到target目录。

额外处理(如果Dockerfile不在项目根目录)

如果Dockerfile放在其他路径,执行构建时需要指定项目根目录为上下文,并指定Dockerfile路径:

docker build -t java_app_tomcat -f ./docker/Dockerfile .

(这里假设Dockerfile在docker子目录下)

内容的提问来源于stack exchange,提问作者Vikas S

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 22:05:29