Docker化含知识库的Java Web应用时遇文件找不到异常
问题:Docker部署Java Web应用时无法找到知识库文件
我在将包含知识库的Java Web应用Docker化时遇到问题。知识库存储在项目根目录的knowledge-repo文件夹中,应用本地运行正常,但Docker部署后抛出java.io.FileNotFoundException,提示找不到knowledge-repo/config/regex_template.yaml文件。
相关配置
application.yaml 片段
knowledge-repo: path: knowledge-repo
Dockerfile 片段
FROM tomcat:jdk21 COPY "knowledge-repo" /usr/local/tomcat/webapps/spec/knowledge-repo WORKDIR /usr/local/tomcat/webapps/temp COPY ./warfile/*.war . RUN jar -xf *.war RUN mv /usr/local/tomcat/webapps/temp/ /usr/local/tomcat/webapps/spec RUN rm -rf /usr/local/tomcat/webapps/temp COPY ./dist /usr/local/tomcat/webapps/ROOT/
已尝试的操作
我曾将knowledge-repo复制到三个不同路径,但均未解决问题:
COPY "knowledge-repo" /usr/local/tomcat/webapps/spec/knowledge-repo COPY "knowledge-repo" /usr/local/tomcat/webapps/knowledge-repo COPY "knowledge-repo" /knowledge-repo
解决方案
核心原因
Java中使用相对路径knowledge-repo时,实际是基于**进程运行的工作目录(CWD)**来定位文件的。Tomcat容器默认工作目录为/usr/local/tomcat,和你存放知识库的路径不匹配,导致找不到文件。
具体解决办法
改用绝对路径配置
根据你最终复制的知识库路径,把application.yaml里的路径改成绝对路径。例如如果知识库在/usr/local/tomcat/webapps/spec/knowledge-repo,配置修改为:knowledge-repo: path: /usr/local/tomcat/webapps/spec/knowledge-repo调整Tomcat工作目录
在Dockerfile末尾添加命令,将Tomcat的工作目录切换到知识库所在的父目录,这样相对路径就能正确指向文件:WORKDIR /usr/local/tomcat/webapps/spec先验证文件是否存在
进入容器确认文件实际路径是否正确:docker exec -it <你的容器ID> /bin/bash # 检查目标文件 ls /usr/local/tomcat/webapps/spec/knowledge-repo/config/regex_template.yaml确认文件存在后再调整配置或工作目录。
内容的提问来源于stack exchange,提问作者twerpiebird
相关产品推荐
相关产品推荐

