FROM debian:bullseye-slim # 构建参数:是否为开发模式 ARG DEV_MODE=false # 将ARG转换为ENV以确保在所有上下文中可用 ENV DEV_MODE=${DEV_MODE} ENV DEBIAN_FRONTEND=noninteractive \ STEAM_USER=root \ STEAM_HOME=/root \ STEAMCMD_DIR=/root/steamcmd \ GAMES_DIR=/root/games \ NODE_VERSION=22.17.0 # 将apt源改为中国镜像源(清华TUNA) RUN sed -i 's/deb.debian.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apt/sources.list \ && sed -i 's/security.debian.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apt/sources.list # 安装Node.js、Python、SteamCMD和常见依赖(包括32位库) RUN apt-get update && apt-get upgrade -y \ && dpkg --add-architecture i386 \ && apt-get update \ && apt-get install -y --no-install-recommends \ ca-certificates \ locales \ wget \ curl \ jq \ xdg-user-dirs \ # Node.js相关依赖 gnupg \ # Python相关依赖 python3 \ python3-pip \ python3-dev \ python3-venv \ # 游戏服务器依赖 libncurses5:i386 \ libbz2-1.0:i386 \ libicu67:i386 \ libxml2:i386 \ libstdc++6:i386 \ lib32gcc-s1 \ libc6-i386 \ lib32stdc++6 \ libcurl4-gnutls-dev:i386 \ libcurl4-gnutls-dev \ libgl1-mesa-glx:i386 \ gcc-10-base:i386 \ libssl1.1:i386 \ libopenal1:i386 \ libtinfo6:i386 \ libtcmalloc-minimal4:i386 \ # .NET和Mono相关依赖(ECO服务器等需要) libgdiplus \ libc6-dev \ libasound2 \ libpulse0 \ libnss3 \ libgconf-2-4 \ libcap2 \ libatk1.0-0 \ libcairo2 \ libcups2 \ libgtk-3-0 \ libgdk-pixbuf2.0-0 \ libpango-1.0-0 \ libx11-6 \ libxt6 \ # Unity游戏服务端额外依赖(7日杀等) libsdl2-2.0-0:i386 \ libsdl2-2.0-0 \ libpulse0:i386 \ libfontconfig1:i386 \ libfontconfig1 \ libudev1:i386 \ libudev1 \ libpugixml1v5 \ libvulkan1 \ libvulkan1:i386 \ libgconf-2-4:i386 \ # 额外的Unity引擎依赖(特别针对7日杀) libatk1.0-0:i386 \ libxcomposite1 \ libxcomposite1:i386 \ libxcursor1 \ libxcursor1:i386 \ libxrandr2 \ libxrandr2:i386 \ libxss1 \ libxss1:i386 \ libxtst6 \ libxtst6:i386 \ libxi6 \ libxi6:i386 \ libxkbfile1 \ libxkbfile1:i386 \ libasound2:i386 \ libgtk-3-0:i386 \ libdbus-1-3 \ libdbus-1-3:i386 \ # ARK: Survival Evolved(方舟生存进化)服务器额外依赖 libelf1 \ libelf1:i386 \ libatomic1 \ libatomic1:i386 \ nano \ net-tools \ netcat \ procps \ tar \ unzip \ bzip2 \ xz-utils \ zlib1g:i386 \ fonts-wqy-zenhei \ fonts-wqy-microhei \ libc6 \ libc6:i386 \ && rm -rf /var/lib/apt/lists/* # 安装Node.js RUN curl -fsSL https://deb.nodesource.com/setup_22.x | bash - \ && apt-get install -y nodejs \ && npm config set registry https://registry.npmmirror.com \ && npm install -g npm@latest # 安装Java 21(通过Adoptium仓库) RUN apt-get update \ && apt-get install -y --no-install-recommends \ wget \ apt-transport-https \ gnupg \ && wget -qO - https://packages.adoptium.net/artifactory/api/gpg/key/public | apt-key add - \ && echo "deb https://packages.adoptium.net/artifactory/deb $(awk -F= '/^VERSION_CODENAME/{print$2}' /etc/os-release) main" | tee /etc/apt/sources.list.d/adoptium.list \ && apt-get update \ && apt-get install -y --no-install-recommends \ temurin-21-jdk \ && rm -rf /var/lib/apt/lists/* # 设置Java环境变量 ENV JAVA_HOME=/usr/lib/jvm/temurin-21-jdk-amd64 \ PATH="$JAVA_HOME/bin:$PATH" # 设置 locales RUN sed -i -e 's/# en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/' /etc/locale.gen \ && sed -i -e 's/# zh_CN.UTF-8 UTF-8/zh_CN.UTF-8 UTF-8/' /etc/locale.gen \ && locale-gen ENV LANG=zh_CN.UTF-8 \ LANGUAGE=zh_CN:zh \ LC_ALL=zh_CN.UTF-8 # 创建应用目录 RUN mkdir -p ${STEAMCMD_DIR} ${GAMES_DIR} /app ${STEAM_HOME}/GSManager # 复制项目文件 COPY . /app/ WORKDIR /app # 下载并安装SteamCMD RUN mkdir -p ${STEAMCMD_DIR} \ && cd ${STEAMCMD_DIR} \ && (if curl -s --connect-timeout 3 http://192.168.10.23:7890 >/dev/null 2>&1 || wget -q --timeout=3 --tries=1 http://192.168.10.23:7890 -O /dev/null >/dev/null 2>&1; then \ echo "代理服务器可用,使用代理下载和初始化"; \ export http_proxy=http://192.168.10.23:7890; \ export https_proxy=http://192.168.10.23:7890; \ wget -t 5 --retry-connrefused --waitretry=1 --read-timeout=20 --timeout=15 -O steamcmd_linux.tar.gz https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz \ || wget -t 5 --retry-connrefused --waitretry=1 --read-timeout=20 --timeout=15 -O steamcmd_linux.tar.gz https://media.steampowered.com/installer/steamcmd_linux.tar.gz; \ tar -xzvf steamcmd_linux.tar.gz; \ rm steamcmd_linux.tar.gz; \ chmod +x ${STEAMCMD_DIR}/steamcmd.sh; \ cd ${STEAMCMD_DIR} && ./steamcmd.sh +quit; \ unset http_proxy https_proxy; \ else \ echo "代理服务器不可用,使用直接连接"; \ wget -t 5 --retry-connrefused --waitretry=1 --read-timeout=20 --timeout=15 -O steamcmd_linux.tar.gz https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz \ || wget -t 5 --retry-connrefused --waitretry=1 --read-timeout=20 --timeout=15 -O steamcmd_linux.tar.gz https://media.steampowered.com/installer/steamcmd_linux.tar.gz; \ tar -xzvf steamcmd_linux.tar.gz; \ rm steamcmd_linux.tar.gz; \ chmod +x ${STEAMCMD_DIR}/steamcmd.sh; \ cd ${STEAMCMD_DIR} && ./steamcmd.sh +quit; \ fi) \ # 创建steamclient.so符号链接 && mkdir -p ${STEAM_HOME}/.steam/sdk32 ${STEAM_HOME}/.steam/sdk64 \ && ln -sf ${STEAMCMD_DIR}/linux32/steamclient.so ${STEAM_HOME}/.steam/sdk32/steamclient.so \ && ln -sf ${STEAMCMD_DIR}/linux64/steamclient.so ${STEAM_HOME}/.steam/sdk64/steamclient.so \ # 创建额外的游戏常用目录链接 && mkdir -p ${STEAM_HOME}/.steam/sdk32/steamclient.so.dbg.sig ${STEAM_HOME}/.steam/sdk64/steamclient.so.dbg.sig \ && mkdir -p ${STEAM_HOME}/.steam/steam \ && ln -sf ${STEAMCMD_DIR}/linux32 ${STEAM_HOME}/.steam/steam/linux32 \ && ln -sf ${STEAMCMD_DIR}/linux64 ${STEAM_HOME}/.steam/steam/linux64 \ && ln -sf ${STEAMCMD_DIR}/steamcmd ${STEAM_HOME}/.steam/steam/steamcmd # 安装依赖 RUN npm run install:all # 安装Python依赖 RUN pip3 install --no-cache-dir -r /app/server/src/Python/requirements.txt # 根据构建参数决定是否构建生产版本 RUN if [ "$DEV_MODE" = "false" ]; then \ npm run package:linux:no-zip && \ cp -r /app/dist/package/* ${STEAM_HOME}/GSManager/ && \ chmod +x ${STEAM_HOME}/GSManager/start.sh && \ # 确保index.js在正确位置 if [ ! -f "${STEAM_HOME}/GSManager/server/index.js" ]; then \ echo "错误:未找到server/index.js文件" && \ ls -la ${STEAM_HOME}/GSManager/server/ && \ exit 1; \ fi; \ else \ cp -r /app/* ${STEAM_HOME}/GSManager/; \ fi # 注意:生产环境的启动脚本已经在打包过程中生成,无需额外复制 # 开发环境才需要复制项目根目录的start.sh RUN if [ "$DEV_MODE" = "true" ]; then \ cp /app/start.sh ${STEAM_HOME}/GSManager/start.sh && \ chmod +x ${STEAM_HOME}/GSManager/start.sh; \ fi # 创建数据目录并复制默认数据 RUN mkdir -p ${STEAM_HOME}/GSManager/server/data \ && cp -r /app/server/data/* ${STEAM_HOME}/GSManager/server/data/ # 创建目录用于挂载游戏数据 VOLUME ["${GAMES_DIR}"] # 暴露GSM3管理面板端口 EXPOSE 3001 WORKDIR ${STEAM_HOME}/GSManager # 根据构建参数设置启动命令 RUN if [ "$DEV_MODE" = "true" ]; then \ echo '#!/bin/bash' > ${STEAM_HOME}/GSManager/start-dev.sh && \ echo 'cd /root/GSManager' >> ${STEAM_HOME}/GSManager/start-dev.sh && \ echo 'echo "启动开发模式..."' >> ${STEAM_HOME}/GSManager/start-dev.sh && \ echo 'echo "前端将在 http://localhost:5173 启动"' >> ${STEAM_HOME}/GSManager/start-dev.sh && \ echo 'echo "后端将在 http://localhost:3001 启动"' >> ${STEAM_HOME}/GSManager/start-dev.sh && \ echo 'echo "文件修改将自动重载"' >> ${STEAM_HOME}/GSManager/start-dev.sh && \ echo 'npm run dev' >> ${STEAM_HOME}/GSManager/start-dev.sh && \ chmod +x ${STEAM_HOME}/GSManager/start-dev.sh; \ fi # 启动容器时运行相应的脚本 ENTRYPOINT ["/bin/bash", "-c", "if [ \"$DEV_MODE\" = \"true\" ]; then /root/GSManager/start-dev.sh; else /root/GSManager/start.sh; fi"]