forked from GSManagerXZ/GameServerManager
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathDockerfile_develop
More file actions
246 lines (222 loc) · 8.92 KB
/
Dockerfile_develop
File metadata and controls
246 lines (222 loc) · 8.92 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
FROM debian:trixie-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
# 安装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 \
# 游戏服务器依赖
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相关依赖(ECO服务器等需要)
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游戏服务端额外依赖(7日杀等)
libsdl2-2.0-0:i386 \
libsdl2-2.0-0 \
libpulse0:i386 \
libfontconfig1:i386 \
libfontconfig1 \
libudev1:i386 \
libudev1 \
libpugixml1v5 \
libvulkan1 \
libvulkan1: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-openbsd \
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仓库,使用 keyrings 方式,替代已弃用的 apt-key)
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
wget \
ca-certificates \
gnupg \
&& 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/*
# 设置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 PIP_BREAK_SYSTEM_PACKAGES=1 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"]