Docker Compose绑定挂载权限问题:Java游戏服务器无法创建文件
问题
使用Docker Compose配合Python启动脚本运行Project Zomboid游戏服务器容器时,容器及依赖可正常启动,但Java编写的游戏服务器进程启动时,出现绑定挂载目录的权限及文件不存在错误:
pztest | ERROR: General , 1696543719203> 1,106,355,549> java.nio.file.AccessDeniedException: /home/pz
pztest | ERROR: General , 1696543719207> 1,106,355,553> java.io.FileNotFoundException: /home/pz/Zomboid/backups/version/backup_1.zip (No such file or directory)
已确认:
- 其他游戏实例可正常实现绑定挂载写入
- 同一用户的Python脚本可在该挂载目录创建配置文件
- 主机目录UID、GID及权限配置均正常
怀疑问题与进程专属UID或Java版本相关,寻求技术解决思路。
附相关配置文件
Docker Compose文件
version: '3' services: pz1: build: context: . dockerfile: "pz_test_dockerfile" image: "pz_image:1.0" volumes: - "/home/servers/pz/test_server:/pz/Zomboid/" container_name: "pztest" environment: sv_ref: "testserver" ports: - "16259:16260/udp" - "16259:16260/tcp" command: [/pz/pz_launch.py]
Dockerfile
FROM ubuntu:latest # Add multiverse repository and install necessary tools RUN apt-get update && apt-get install -y \ software-properties-common curl && \ add-apt-repository multiverse && \ apt-get update # Install 32-bit architecture support and dependencies RUN dpkg --add-architecture i386 && \ DEBIAN_FRONTEND=noninteractive \ apt-get update && \ apt-get install --no-install-recommends --assume-yes \ libc6:i386 libncurses5:i386 libstdc++6:i386 openjdk-11-jre-headless python3 \ && apt-get clean RUN mkdir -p /opt/steamcmd && \ groupadd -g 1016 servers && \ useradd -g 1016 -u 1015 pz # Copy over Addon Files & Python Script COPY --chown=pz:1016 pz_launch.py /pz/pz_launch.py COPY --chown=pz:1016 pz_settings.py /pz/pz_settings.py COPY --chown=pz:1016 server.ini /pz/server.ini COPY --chown=pz:1016 servercvars.lua /pz/servercvars.lua RUN curl -s https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz | tar -vxz -C /opt/steamcmd RUN /opt/steamcmd/steamcmd.sh +quit # Change ownership and exec. of the files RUN chmod 775 /pz/ \ && chmod +x /pz/pz_launch.py \ && chmod +x /pz/pz_settings.py \ && chmod +x /opt/steamcmd/steamcmd.sh \ && chown -R pz:1016 /opt/ \ && chown -R pz:1016 /pz/ # Change to PZ user USER pz
排查与解决方案
1. 容器内路径映射不匹配问题
从错误日志看,Java进程默认尝试访问/home/pz/Zomboid/作为数据目录,但你的挂载路径是/pz/Zomboid/,导致路径错位。
解决办法:
- 在Dockerfile中创建
/home/pz/Zomboid/目录,并建立软链接指向挂载目录:RUN mkdir -p /home/pz/Zomboid && ln -s /pz/Zomboid/* /home/pz/Zomboid/ - 或者在Python启动脚本中添加环境变量,指定游戏服务器的数据目录为
/pz/Zomboid/(具体变量参考Project Zomboid官方文档,通常为ZOMBOID_DATA_DIR)。
2. 父目录权限不足
Java进程需要访问/home/pz/目录的权限,但该目录默认属于root用户,导致AccessDeniedException。
解决办法:
- 在Dockerfile中修改
/home/pz/的所有权为pz:1016:RUN mkdir -p /home/pz && chown -R pz:1016 /home/pz
3. Java进程用户身份异常
确认Python脚本启动Java进程时是否保持pz用户身份,若脚本意外切换用户(如使用sudo),会导致权限不匹配。
解决办法:
- 在Python脚本中添加代码打印当前用户(如
os.system('whoami')),验证启动Java时的身份。 - 确保启动Java的命令未使用用户切换逻辑。
4. 32位Java兼容性问题
安装的32位依赖可能导致Java在处理文件权限时出现异常,若游戏服务器支持64位环境,可尝试替换:
解决办法:
- 修改Dockerfile中的Java安装命令为64位版本:
# 替换原Java安装行 apt-get install --no-install-recommends --assume-yes openjdk-11-jre-headless:amd64
5. 主机SELinux限制(Linux环境)
若主机启用SELinux,可能阻止容器写入挂载目录。
解决办法:
- 临时关闭SELinux测试:
sudo setenforce 0 - 若问题解决,为挂载目录设置正确的SELinux上下文:
sudo chcon -Rt svirt_sandbox_file_t /home/servers/pz/test_server
内容的提问来源于stack exchange,提问作者R4pt0r
相关产品推荐
相关产品推荐

