还是想每天坚持写点什么,也是菜的出奇,只能写一些很表层的东西。今天就记录一下工作中遇到docker部署到linux服务器的一个小坑。
项目中有个预览功能,要求返回给前台base64的图片,但是ftp上只有pdf格式,所以要先将pdf文件在后台转化成jpg放在本地默认的临时文件夹(System.getProperty("java.io.tmpdir"))下,然后通过流读取本地的jpg文件来返回给前端,再删除本地的文件。
刚开始是没有用docker,直接以jar包的形式在linux上部署运行,是没有问题的。但是用了docker部署之后,本地正常,服务器一直报错找不到文件,这个问题找了一下午(第一次用docker)。最后才发现是docker这个虚拟化容器导致的路径问题。
因为在linux上直接用jar运行,代码里的System.getProperty("java.io.tmpdir")指向的是linux的根目录下的tmp文件夹,生成的jpg文件会自动创建到tmp中,所以不会报找不到文件的异常。但是用了docker部署之后,因为docker也相当于一个精简版的linux容器,他有自己的路径,跟宿主linux的路径不一致,所以就会报找不到文件的异常。
解决这个问题的方法有两种:
1.代码中如果要生成临时文件到本地,最好在默认的工作目录下新建一个file的目录,及System.getProperty("user.dir")+“file”(代码中判断,如果没有则新建),这个路径其实就是你的项目根路径的file文件夹,在linux中就是根目录下的file文件夹,然后直接将宿主根目录的file文件夹(自己建的)挂载到docker的根目录下的file文件夹(问题其实就是生成的文件在docker容器中的/file文件夹中而不在linux的/file下)。这样就解决了因为docker容器造成的与linux宿主容器路径不一致的问题。
2.挂载宿主的tmp文件夹到docker容器里对应的文件夹(如何操作先看看docker配置,我就只说思路了,未亲测)。
文笔很水,无力吐槽自己,继续努力吧!!!