Docker Compose部署Java Socket文件服务时卷挂载文件创建异常
Docker Compose环境下File Server Socket文件传输故障排查
核心结论
故障由Docker Compose配置缩进错误+Java代码相对路径兼容问题+目录权限风险共同导致,本地运行正常是因为本地环境的工作目录、服务启动逻辑和容器环境存在差异。
具体问题点
1. Docker Compose配置存在硬错误
你贴的配置里fileserver服务缩进错误,被嵌套在了table服务的配置块下:
table: image: table links: - users_db depends_on: - users_db fileserver: # 这里多缩进了一层,被识别为table服务的子属性,不是独立服务 image: fileserver volumes: - fileServer:/pliki
Compose解析时根本不会把fileserver识别为独立服务启动,客户端/API网关自然无法通过Socket连接到文件服务,这是传输故障的最直接原因。
除此之外配置还有两个潜在问题:
- 命名卷
fileServer挂载到容器内/pliki路径时,默认权限归root用户所有,如果你的Java进程用非root用户运行,会没有目录写权限,创建文件直接抛IO异常。 - 命名卷由Docker独立管理,其他服务无法直接读取卷内文件,跨服务访问文件必须走fileserver的对外接口,不能直接读本地路径。
2. Java文件操作代码存在容器兼容问题
现有代码用相对路径操作文件:
File directory = new File("pliki"); if (!directory.exists()) { directory.mkdir(); } String fileName = message.split("#")[1].split(":")[1]; File file = new File("pliki/" + fileName);
- 相对路径
pliki是相对于JVM的启动工作目录解析的,本地运行时你一般在项目根目录启动程序,路径符合预期;但容器内如果没在Dockerfile中显式指定WORKDIR,默认工作目录是/,代码创建的目录实际会落到预期外的路径,和你配置的卷挂载路径不匹配,写入的文件不会落到持久化卷里。 mkdir()方法只能创建单级目录,上层路径不存在时会直接返回创建失败,且没有异常抛出,排查难度很高。- 没有做文件名合法性校验,如果传入的文件名带
../等路径穿越字符,会把文件写到预期目录之外。
修复步骤
- 修正Compose配置缩进,把
fileserver服务调整为和其他服务同级的顶层服务:table: image: table links: - users_db depends_on: - users_db fileserver: image: fileserver volumes: - fileServer:/pliki restart: always server: image: api ports: - "1000:1000" links: - login - fileserver - registration - chat - table - 修改Java文件操作逻辑,使用和挂载路径一致的绝对路径,替换目录创建方法,增加失败校验和文件名过滤:
// 直接指定容器内的绝对挂载路径,不受JVM工作目录影响 File directory = new File("/pliki"); if (!directory.exists()) { // mkdirs支持递归创建多级父目录,创建失败直接抛错方便定位问题 boolean createSuccess = directory.mkdirs(); if (!createSuccess) { throw new RuntimeException("文件存储目录创建失败,请检查路径权限"); } } // 过滤路径穿越字符,避免文件写到预期目录外 String rawFileName = message.split("#")[1].split(":")[1]; String safeFileName = rawFileName.replace("..", "").replace("/", "").replace("\\", ""); File file = new File(directory, safeFileName); - 在fileserver的Dockerfile中提前创建存储目录并开放权限,避免权限问题:
RUN mkdir -p /pliki && chmod 755 /pliki
内容的提问来源于stack exchange,提问作者LLager
相关产品推荐
相关产品推荐

