You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 13:20:21