
本容器非Valve官方Steam容器。
弃用通知
几年前我已从Docker转向其他容器解决方案,将不再维护此Docker镜像。容器在启动时会自动更新,因此在下次Ubuntu主要版本发布前应仍可使用。如需继续使用,请根据需要进行分叉和更新。
基于Docker的通用Steam专用服务器。
提供steamcmd的核心安装,用于托管专用服务器。通过wine支持,可同时托管Linux和Windows服务器。
Docker镜像包含基础Ubuntu安装,带有wine(Windows支持)和最新的steamcmd工具。
启动容器后:
为steam用户设置权限。
更新操作系统(若启用)。
更新steamcmd(若启用)。
更新指定的Steam专用服务器(若启用)。
以root身份执行/data/custom_server。
/data目录中创建此脚本并设置为可执行。不同专用服务器的完整工作示例:
| 标签 | 描述 |
|---|---|
| stable | Ubuntu 20.04:包含wine、steamcmd(包)。 |
| latest | Ubuntu 20.04:包含winehq STABLE包、steamcmd(包)。可能会损坏。 |
| experimental | Ubuntu 20.04:包含winehq STAGING包、steamcmd(包)。可能会损坏。 |
| 参数 | 功能 | 默认值 |
|---|---|---|
| SERVER_DIR | 服务器文件位置。 | /data/server |
| STEAM | steamcmd客户端位置。 | /steam |
| PLATFORM | 自动更新时强制指定的平台。linux或windows。 | windows |
| STEAM_APP_ID | 用于自动更新的Steam应用ID。 | 0 |
| STEAM_APP_EXTRAS | 可选。Steam应用更新的附加选项和值,例如设置BETA版本。 | `` |
| UPDATE_OS | 启动时更新核心操作系统。1启用,0禁用。 | 1 |
| UPDATE_STEAM | 启动时更新steamcmd。1启用,0禁用。 | 1 |
| UPDATE_SERVER | 启动时更新STEAM_APP_ID指定的专用服务器。1启用,0禁用。 | 1 |
| PUID | 运行steamcmd及挂载权限的用户ID。 | 1000 |
| PGID | 运行steamcmd及挂载权限的组ID。 | 1000 |
| LANG | 容器中使用的语言环境。 | en_US.UTF-8 |
| LANGUAGE | 容器中使用的语言环境。 | en_US:UTF-8 |
| LC_ALL | 容器中使用的语言环境。 | en_US.UTF-8 |
容器暴露的默认端口。可在Docker配置中暴露服务器所需的额外端口。
有关Steam所需端口的详细列表,请参见Steam所需端口。
| 端口 | 协议 | 是否必需 | 描述 |
|---|---|---|---|
27015 | UDP | 必需 | 游戏流量。 |
27015 | TCP | 可选 | SRCDS RCON端口。 |
27016 | UDP | 可选 | Steam公告流量。 |
| 卷 | 功能 |
|---|---|
| /data | 镜像的用户数据位置。 |
使用数据卷(-v标志)时,主机和容器之间可能出现权限问题。例如,容器内的用户可能在主机上不存在,这可能导致主机无法正确访问共享卷上的文件和文件夹。
为避免问题,可指定应用应运行的用户。
通过PUID和PGID环境变量将用户ID和组ID传递给容器。
要找到正确的ID,请在主机上使用拥有数据卷的用户执行以下命令:
id <用户名>
输出如下:
uid=1000(myuser) gid=1000(myuser) groups=1000(myuser),4(adm),24(cdrom),27(sudo),46(plugdev),113(lpadmin)
uid(用户ID)和gid(组ID)的值应提供给容器。
从 scratch 设置新服务器的详细步骤。工作示例见示例配置。
--- version: "3" services: steam: image: rpufky/steam:stable restart: unless-stopped ports: - 27015:27015 - 27015:27015/udp - 27016:27016/udp environment: - PUID=1000 - PGID=1000 - UPDATE_OS=1 - UPDATE_STEAM=1 - UPDATE_SERVER=1 - PLATFORM=windows - STEAM_APP_ID=443030 - TZ=America/Los_Angeles volumes: - /my/docker/server/data:/data - /etc/localtime:/etc/localtime:ro
--- version: "3" services: steam: image: rpufky/steam:stable restart: unless-stopped ports: - 27015:27015 - 27015:27015/udp - 27016:27016/udp environment: - PUID=1000 - PGID=1000 - UPDATE_OS=1 - UPDATE_STEAM=1 - UPDATE_SERVER=1 - PLATFORM=linux - STEAM_APP_ID=294420 - TZ=America/Los_Angeles volumes: - /my/docker/server/data:/data - /etc/localtime:/etc/localtime:ro
/data/custom_server是Docker容器启动时调用的脚本。您需要控制此脚本以按需求设置服务器。必须创建此脚本并确保其可执行。
提供supervisord以方便服务管理。
专用服务器文件会自动安装到${SERVER_DIR},所有Docker环境变量均可使用。
可在此处执行任何启动前配置(如更新或安装模组、备份等)。创建的任何文件将属于root,因此需确保权限已更改。
启动服务器前请降低权限,这将确保游戏存在漏洞时的最小暴露风险,并防止服务器文件的权限问题。
su - steam -c '您的服务器启动命令'
具体启动命令因安装的服务器而异。请查阅该游戏的专用服务器文档。
启动Left 4 Dead的srcsd_run Linux专用服务器:
su - steam -c "/data/server/srcds_run -console -game left4dead -map l4d_hospital01_apartment -port 27015 +maxplayers 4 -nohltv +exec /data/server.cfg"
已安装所有版本的wine(wind、wine32和wine64)。有关在wine下启动Windows专用服务器的方法,请查阅特定游戏的专用服务器文档和论坛。
bashsu - steam -c "xvfb-run --auto-servernum \ wine64 ${SERVER_DIR}/ConanSandbox/Binaries/Win64/ConanSandboxServer-Win64-Test.exe -nosteamclient -game -server -log"
注意,启动这些服务器必须启动轻量级窗口管理器。
xvfb-run --auto-servernum即用于此目的。
对于重启之间不需要保存状态的服务器,简单的bash脚本即可管理:
Windows
bash# 运行wine(适用于Windows服务器)并启动服务器。 su - steam -c "xvfb-run --auto-servernum \ wine64 ${SERVER_DIR}/ConanSandbox/Binaries/Win64/ConanSandboxServer-Win64-Test.exe -nosteamclient -game -server -log"
Linux
bash# 以steam用户启动Linux专用服务器。 su - steam -c "/data/server/startserver.sh \ -configfile=/data/server/serverconfig.xml"
如果专用服务器在关闭时需要特定的状态保存,bash可用于管理关闭过程。这适用于较简单的专用服务器。更复杂的服务器应考虑使用包含的supervisord进程管理器。
如需,确保Docker容器有超过10秒的关闭时间:
services: steam: image: rpufky/steam:latest restart: unless-stopped stop_grace_period: 1m ...
/data/custom_server:
bash#!/bin/bash # # 以Root身份运行。降低权限。 # # 捕获kill/term信号并发送SIGINT以优雅关闭Conan服务器。 PROCESS_WAIT_TIME=25 WATCHDOG_TIME=300 function shutdown() { echo '正在关闭服务器...' if [ "$(pgrep -n Conan)" != '' ]; then echo "向Conan服务器发送SIGINT(最长${PROCESS_WAIT_TIME}秒)..." kill -SIGINT `pgrep -n Conan` sleep ${PROCESS_WAIT_TIME} fi if [ "$(pgrep wine)" != '' ]; then echo "向wine进程发送SIGINT(最长${PROCESS_WAIT_TIME}秒)..." kill -SIGINT `pgrep wine` sleep ${PROCESS_WAIT_TIME} fi exit 0 } trap shutdown SIGINT SIGKILL SIGTERM function start_server() { su - steam -c "xvfb-run --auto-servernum wine64 ${SERVER_DIR}/ConanSandbox/Binaries/Win64/ConanSandboxServer-Win64-Test.exe -nosteamclient -game -server -log" } function watch_server() { if ps aux | grep [C]onanSandboxServer > /dev/null; then echo '服务器正在运行...' else echo '正在启动服务器...' start_server & fi } while true; do watch_server # 使用后台睡眠并等待以捕获信号陷阱。 sleep ${WATCHDOG_TIME} & wait done
提供supervisor以方便服务管理。如需使用进程管理器管理服务器,只需将/data/custom_server设置为:
bash/usr/bin/supervisord -c /etc/supervisor/supervisord.conf
然后将所有supervisord配置文件放在/data/supervisord并确保设置正确权限。Supervisord将以root身份启动,应使用user=steam执行服务器以降低进程权限。
Conan Exiles服务器的https://github.com/alinmear/docker-conanexiles/blob/master/src/etc/supervisor/conf.d/conanexiles.conf可https://github.com/alinmear/docker-conanexiles/blob/master/src/etc/supervisor/conf.d/conanexiles.conf。
确保Docker容器有超过10秒的关闭时间:
services: steam: image: rpufky/steam:latest restart: unless-stopped stop_grace_period: 1m ...
winetricks已安装到/usr/bin/winetricks,可在custom_server中用于应用特定补丁;执行命令时记得切换到steam用户。
custom_server
bashsu - steam -c "winetricks dotnet472" su - steam -c "winetricks vcrun2013"
debian-slim和ubuntu镜像的构建大小相差约2-3MB,因此仅使用ubuntu基础。使用包含的makefile构建:
使用ubuntu wine仓库的主steam镜像:
bashsudo make steam
使用winehq仓库的steam镜像:
bashsudo make latest
当steamcmd下载应用时发生,因为无法查询底层数据存储的配额。常见于ZFS支持的数据存储。可设置显式配额或忽略。
sudo zfs set quota=2T zpool1/docker
Wine在首次启动时可能阻塞启动事件。表现为在以下消息期间约5分钟的暂停:
"0014:err:ole:get_local_server_stream Failed: 80004002"
_"_wine_kernel_init boot event wait timed out"
后续启动不会有此延迟。容器构建中已尝试缓解,但可手动运行:
bashwineboot --update
bashxvfb-run --autoservernum wineboot --update
这被怀疑与GCC构建工具链有关,但尚未解决。参见:
当srcds_run无法将PID写入自动生成的PID文件时发生。
在容器中手动指定steam用户可访问的PID文件。
bashsrcds_run ... -pidfile /data/server/{GAME}.pid
steamclient.so或[S_API FAIL] SteamAPI_Init() ... 或本地steamclient.dll。未在路径中找到Steam Linux共享库。
确保使用su - steam -c加载完整的steam用户配置文件。
链接到本地steamclient.so文件,或将其复制到服务器二进制文件执行位置。默认位置在steam用户目录中:
bash/steam/.steam/steamcmd/linux{32,64}/steamclient.so
ln -s -f /steam/.steam/steamcmd/linux32/steamclient.so /steam/.steam/sdk32/steamclient.so
Steam徽标、SteamCMD ©2019 Valve Corporation。Steam和Steam徽标是Valve Corporation在美国和/或其他国家的商标和/或注册商标。
您可以使用以下命令拉取该镜像。请将 <标签> 替换为具体的标签版本。如需查看所有可用标签版本,请访问 标签列表页面。





探索更多轩辕镜像的使用方法,找到最适合您系统的配置方式
通过 Docker 登录认证访问私有仓库
无需登录使用专属域名
Kubernetes 集群配置 Containerd
K3s 轻量级 Kubernetes 镜像加速
VS Code Dev Containers 配置
Podman 容器引擎配置
HPC 科学计算容器配置
ghcr、Quay、nvcr 等镜像仓库
Harbor Proxy Repository 对接专属域名
Portainer Registries 加速拉取
Nexus3 Docker Proxy 内网缓存
需要其他帮助?请查看我们的 常见问题Docker 镜像访问常见问题解答 或 提交工单
docker search 限制
站内搜不到镜像
离线 save/load
插件要用 plugin install
WSL 拉取慢
安全与 digest
新手拉取配置
镜像合规机制
manifest unknown
no matching manifest(架构)
invalid tar header(解压)
TLS 证书失败
DNS 超时
域名连通性排查
410 Gone 排查
402 与流量用尽
401 认证失败
429 限流
D-Bus 凭证提示
413 与超大单层
来自真实用户的反馈,见证轩辕镜像的优质服务