Docker运行jar包时找不到指定路径的R.txt文件,该如何正确配置文件路径?
问题原因
Docker容器拥有独立的隔离文件系统,和宿主机的文件系统不互通。你代码中写死了绝对路径/home/ubuntu/R.txt,这个路径是宿主机的路径,容器内部默认不存在该路径和对应文件,所以会抛出文件不存在的错误。
解决方案
方案1:将R.txt打包进Docker镜像
直接在Dockerfile中添加文件复制指令,把本地的R.txt复制到镜像内的对应路径,步骤如下:
- 修改你的Dockerfile,在合适的位置(一般是复制jar包的指令前后)添加如下行:
RUN mkdir -p /home/ubuntu COPY R.txt /home/ubuntu/R.txt
- 重新执行
docker build -t fb:1.1-SNAPSHOT .构建镜像,之后启动容器即可正常识别文件。
优势:镜像可直接分发运行,无需额外挂载文件,适合文件不需要频繁修改的场景
方案2:启动容器时挂载宿主机的文件/目录
如果R.txt需要频繁修改,不想每次改完都重新构建镜像,可以用容器挂载的方式,直接把宿主机的文件映射到容器内的对应路径,不需要修改Dockerfile:
- 执行run命令时添加
-v挂载参数,命令如下:
docker run -p 8080:8080 -v /home/ubuntu/R.txt:/home/ubuntu/R.txt fb:1.1-SNAPSHOT
- 该指令会把宿主机
/home/ubuntu/R.txt直接映射到容器内的相同路径,容器内程序读取到的就是宿主机上的对应文件,修改宿主机的文件容器内也会实时生效。
优势:修改文件不需要重新构建镜像,适合配置类需要频繁调整的文件场景
可选优化:修改代码使用相对路径
如果不想被绝对路径限制,可以把代码中的路径修改为相对路径./R.txt,之后只需要把R.txt和jar包放在容器的同一个工作目录下即可,不需要指定固定的绝对路径,灵活性更高。
内容的提问来源于stack exchange,提问作者Max
相关产品推荐
相关产品推荐

