GameServerManager/Dockerfile
2025-09-24 21:59:33 +08:00

306 lines
No EOL
11 KiB
Docker
Raw Permalink 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:trixie-slim AS dependencies
ENV DEBIAN_FRONTEND=noninteractive
# 获取架构信息
ARG TARGETARCH
ARG TARGETPLATFORM
# 安装基础系统依赖包(所有架构通用)
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
ca-certificates \
locales \
wget \
curl \
jq \
xdg-user-dirs \
gnupg \
# Python相关依赖
python3 \
python3-pip \
python3-dev \
python3-venv \
# 基础系统工具
nano \
net-tools \
netcat-openbsd \
procps \
tar \
unzip \
bzip2 \
xz-utils \
fonts-wqy-zenhei \
fonts-wqy-microhei \
libc6 \
acl \
sudo \
&& apt-get autoremove -y \
&& apt-get autoclean \
&& rm -rf /var/lib/apt/lists/*
# 仅在AMD64架构上安装游戏服务器依赖和i386架构支持
RUN if [ "$TARGETARCH" = "amd64" ]; then \
echo "检测到AMD64架构安装游戏服务器依赖..." && \
dpkg --add-architecture i386 && \
apt-get update && \
apt-get install -y --no-install-recommends \
# 游戏服务器依赖
libncurses6:i386 \
libbz2-1.0:i386 \
libicu-dev \
libxml2:i386 \
libstdc++6:i386 \
lib32gcc-s1 \
libc6-i386 \
lib32stdc++6 \
libcurl4-gnutls-dev:i386 \
libcurl4-gnutls-dev \
libgl1 \
gcc-13-base:i386 \
libssl3:i386 \
libopenal1:i386 \
libtinfo6:i386 \
libtcmalloc-minimal4:i386 \
# .NET和Mono相关依赖
libgdiplus \
libc6-dev \
libasound2 \
libpulse0 \
libnss3 \
libcap2 \
libatk1.0-0 \
libcairo2 \
libcups2 \
libgtk-3-0 \
libgdk-pixbuf-2.0-0 \
libpango-1.0-0 \
libx11-6 \
libxt6 \
# Unity游戏服务端依赖
libsdl2-2.0-0:i386 \
libsdl2-2.0-0 \
libpulse0:i386 \
libfontconfig1:i386 \
libfontconfig1 \
libudev1:i386 \
libudev1 \
libpugixml1v5 \
libvulkan1 \
libvulkan1:i386 \
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服务器依赖
libelf1 \
libelf1:i386 \
libatomic1 \
libatomic1:i386 \
zlib1g:i386 \
libc6:i386 && \
apt-get autoremove -y && \
apt-get autoclean && \
rm -rf /var/lib/apt/lists/*; \
else \
echo "检测到ARM64架构跳过游戏服务器依赖安装"; \
fi
# ---------- 开发工具安装阶段 ----------
FROM dependencies AS tools
# 安装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 \
&& rm -rf /var/lib/apt/lists/*
# 安装Java 21支持多架构
RUN install -d -m 0755 /usr/share/keyrings \
&& wget -qO /usr/share/keyrings/adoptium.gpg https://packages.adoptium.net/artifactory/api/gpg/key/public \
&& echo "deb [signed-by=/usr/share/keyrings/adoptium.gpg] https://packages.adoptium.net/artifactory/deb $(awk -F= '/^VERSION_CODENAME/{print$2}' /etc/os-release) main" > /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/*
# 配置Python pip镜像源
RUN pip3 config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
# ---------- 用户权限配置阶段 ----------
FROM tools AS base
ENV STEAM_USER=steam \
STEAM_HOME=/root \
STEAMCMD_DIR=/root/steamcmd \
GAMES_DIR=/root/games \
NODE_VERSION=22.17.0
# 设置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
# 创建steam用户并配置权限
RUN useradd -m -s /bin/bash ${STEAM_USER} \
&& usermod -aG root ${STEAM_USER} \
&& usermod -aG sudo ${STEAM_USER} \
&& usermod -aG tty ${STEAM_USER} \
&& echo "${STEAM_USER} ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
# 配置steam用户的shell环境
RUN echo "set +m" >> /home/steam/.bashrc \
&& echo "export SHELL=/bin/bash" >> /home/steam/.bashrc \
&& echo "export TERM=xterm-256color" >> /home/steam/.bashrc \
&& echo "stty -echoctl 2>/dev/null || true" >> /home/steam/.bashrc \
&& echo "set +o monitor" >> /home/steam/.bashrc
# 创建目录和设置基础权限
RUN mkdir -p ${STEAMCMD_DIR} ${GAMES_DIR} /app \
&& ln -sf /root /home/steam/root_access \
&& chown -R ${STEAM_USER}:root /home/steam \
&& chown -R ${STEAM_USER}:root /app \
&& chmod -R 755 /home/steam \
&& chmod -R 755 /app \
&& chmod -R 755 /root
# 设置ACL权限确保steam用户对root目录有完全访问权限
RUN setfacl -R -m u:${STEAM_USER}:rwx /root \
&& setfacl -R -d -m u:${STEAM_USER}:rwx /root \
&& chmod 666 /dev/tty* 2>/dev/null || true \
&& chmod 666 /dev/pts/* 2>/dev/null || true
# 设置环境变量(支持多架构)
# 动态设置JAVA_HOME
RUN if [ "$TARGETARCH" = "amd64" ]; then \
echo "JAVA_HOME=/usr/lib/jvm/temurin-21-jdk-amd64" >> /etc/environment && \
echo "PATH=/usr/lib/jvm/temurin-21-jdk-amd64/bin:\$PATH" >> /etc/environment; \
elif [ "$TARGETARCH" = "arm64" ]; then \
echo "JAVA_HOME=/usr/lib/jvm/temurin-21-jdk-arm64" >> /etc/environment && \
echo "PATH=/usr/lib/jvm/temurin-21-jdk-arm64/bin:\$PATH" >> /etc/environment; \
fi
# 设置通用环境变量
ENV LANG=zh_CN.UTF-8 \
LANGUAGE=zh_CN:zh \
LC_ALL=zh_CN.UTF-8
# 为当前构建设置JAVA_HOME构建时使用
RUN if [ "$TARGETARCH" = "amd64" ]; then \
export JAVA_HOME=/usr/lib/jvm/temurin-21-jdk-amd64; \
elif [ "$TARGETARCH" = "arm64" ]; then \
export JAVA_HOME=/usr/lib/jvm/temurin-21-jdk-arm64; \
fi
# ---------- 构建阶段 ----------
FROM base AS builder
# 拷贝源码用于构建
COPY --chown=steam:steam . /app/
USER ${STEAM_USER}
WORKDIR /app
# 使用 npm 构建前后端产物(针对不同架构优化)
RUN if [ "$TARGETARCH" = "arm64" ]; then \
echo "ARM64架构构建使用优化配置..." && \
export NODE_OPTIONS="--max-old-space-size=2048" && \
npm config set fetch-retry-mintimeout 20000 && \
npm config set fetch-retry-maxtimeout 120000 && \
npm config set fetch-timeout 300000 && \
npm run install:all && \
npm run package:linux:no-zip; \
else \
echo "AMD64架构构建使用标准配置..." && \
npm run install:all && \
npm run package:linux:no-zip; \
fi
# ---------- 运行阶段(最终镜像) ----------
FROM base AS runtime
# 仅在AMD64架构上安装并初始化 SteamCMD
RUN if [ "$TARGETARCH" = "amd64" ]; then \
echo "在AMD64架构上安装SteamCMD..." && \
mkdir -p ${STEAMCMD_DIR} && \
cd ${STEAMCMD_DIR} && \
(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 && \
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; \
else \
echo "ARM64架构跳过SteamCMD安装" && \
mkdir -p ${STEAMCMD_DIR} ${GAMES_DIR}; \
fi
# 拷贝构建产物与默认数据
COPY --from=builder /app/dist/package/ /root/
COPY --from=builder /app/server/data/ /root/server/data/
# 拷贝 Python 依赖清单并安装
COPY --from=builder /app/server/src/Python/requirements.txt /tmp/requirements.txt
# 安装Python依赖并配置最终权限
RUN PIP_BREAK_SYSTEM_PACKAGES=1 pip3 install --no-cache-dir -r /tmp/requirements.txt \
&& rm -rf /root/.cache/pip /home/steam/.cache /tmp/* /var/tmp/* \
&& chmod -R 775 /root /root/server /root/server/data
# 最终权限配置
RUN setfacl -R -m u:steam:rwx /root \
&& setfacl -R -d -m u:steam:rwx /root \
&& echo "export ROOT_ACCESS=/root" >> /home/steam/.bashrc \
&& echo "export PATH=/root:\$PATH" >> /home/steam/.bashrc \
&& chown steam:tty /dev/tty* 2>/dev/null || true \
&& chmod g+rw /dev/tty* 2>/dev/null || true
# 复制启动脚本到root目录
COPY start.sh /root/start.sh
RUN chmod +x /root/start.sh
# 创建steam用户专用的shell启动脚本
RUN echo '#!/bin/bash' > /home/steam/steam_shell.sh \
&& echo 'export SHELL=/bin/bash' >> /home/steam/steam_shell.sh \
&& echo 'export TERM=xterm-256color' >> /home/steam/steam_shell.sh \
&& echo 'set +m' >> /home/steam/steam_shell.sh \
&& echo 'set +o monitor' >> /home/steam/steam_shell.sh \
&& echo 'stty -echoctl 2>/dev/null || true' >> /home/steam/steam_shell.sh \
&& echo 'cd /root' >> /home/steam/steam_shell.sh \
&& echo 'exec /bin/bash --login "$@"' >> /home/steam/steam_shell.sh \
&& chmod +x /home/steam/steam_shell.sh \
&& chown steam:steam /home/steam/steam_shell.sh
# 创建目录用于挂载游戏数据
VOLUME ["${GAMES_DIR}"]
# 暴露GSM3管理面板端口
EXPOSE 3001
# 保持root用户
USER root
WORKDIR /root
# 启动容器时运行start.sh
ENTRYPOINT ["/root/start.sh"]