使用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
问题原因
- 本地未生成WAR包:Java项目未执行Maven/Gradle打包命令,导致根目录下没有
target文件夹及WAR文件。 - 构建上下文错误:执行
docker build时的工作目录不是项目根目录,或者指定的上下文路径不包含target目录。 - 容器内路径错误:
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
相关产品推荐
相关产品推荐

