Files
GameServerManager/Dockerfile_develop
2025-07-17 12:47:10 +08:00

249 lines
9.0 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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"]