
https://hub.docker.com/r/gameservermanagers/steamcmd
https://github.com/GameServerManagers/docker-steamcmd/actions
https://github.com/GameServerManagers/docker-steamcmd/blob/main/LICENSE
SteamCMD是Steam客户端的命令行版本,允许在无头服务器上下载和安装游戏/服务器应用。此容器镜像每日构建,可在https://hub.docker.com/r/gameservermanagers/steamcmd%E5%92%8Chttps://github.com/GameServerManagers/docker-steamcmd/pkgs/container/steamcmd%E8%8E%B7%E5%8F%96%E3%80%82
| 标签 | Ubuntu版本 | 标准支持结束时间* | 说明 |
|---|---|---|---|
latest, ubuntu | 24.04 LTS (Noble) | 2029年4月 | 当前LTS版本 |
ubuntu-24.04 | 24.04 LTS (Noble Numbat) | 2029年4月 | 当前LTS版本 |
ubuntu-22.04 | 22.04 LTS (Jammy Jackalope) | 2027年4月 | 上一LTS版本 |
ubuntu-20.04 | 20.04 LTS (Focal Fossa) | 2025年4月 | 旧版本(仍接收安全更新) |
*日期基于Canonical发布的LTS支持计划中的标准(免费)安全更新结束时间。扩展安全维护(ESM)可能会延长这些日期,但如果上游包(如SteamCMD依赖项)不可用,镜像可能会提前弃用。
拉取最新镜像并打开SteamCMD交互式终端:
bashdocker run -it --rm gameservermanagers/steamcmd:latest
下载并更新应用到当前主机目录(示例:Garry's Mod专用服务器 - appid 4020):
bashdocker run -it --rm \ -e PUID=$(id -u) -e PGID=$(id -g) \ -v "$PWD:/data" \ gameservermanagers/steamcmd:latest \ +force_install_dir /data +login anonymous +app_update 4020 +quit
SteamCMD将其库数据(清单、仓库、创意工坊缓存)存储在/home/steam/.local/share/Steam。我们使用+force_install_dir将应用文件放置在独立目录中。如果省略+force_install_dir(或在第一个+app_update之后放置),应用将安装在:
text/home/steam/.local/share/Steam/steamapps/common/<应用名称>
使用独立挂载(如/data)并配合+force_install_dir /data可将应用文件与Steam库缓存分离。
bashdocker run -it --rm \ -e PUID=$(id -u) -e PGID=$(id -g) \ -v "$PWD:/data" \ -v "/path/on/host/steamcmd-app:/home/steam/.local/share/Steam" \ gameservermanagers/steamcmd:latest \ +force_install_dir /data +login anonymous +app_update 4020 +quit
bashdocker volume create steamcmd-data docker volume create steamcmd-app docker run -it --rm \ -v "steamcmd-data:/data" \ -v "steamcmd-app:/home/steam/.local/share/Steam" \ gameservermanagers/steamcmd:latest \ +force_install_dir /data +login anonymous +app_update 4020 +quit
镜像使用非root用户steam(默认UID:GID 1000:1000)。可通过环境变量PUID和PGID在运行时覆盖这些ID;入口点会在执行SteamCMD前映射用户/组,使创建的文件与主机用户匹配。
bashdocker run --rm \ -e PUID=1001 -e PGID=1001 \ -v "$PWD/steam-app:/home/steam/.local/share/Steam" \ -v "$PWD/server-data:/data" \ gameservermanagers/steamcmd:latest \ +force_install_dir /data +login anonymous +app_update 4020 +quit
也可修改构建时默认值(大多数用户不需要):
bashdocker build --build-arg PUID=1001 --build-arg PGID=1001 -t steamcmd:uid1001 -f Dockerfile.ubuntu-2404 .
| 症状 | 原因 | 解决方法 |
|---|---|---|
| 文件未显示在目录中 | 主机目录由不同UID拥有 | 使用匹配的PUID/PGID或更改主机目录所有权 |
| 每次运行都需要Steam Guard代码 | Sentry文件未持久化(无卷或不可写) | 挂载并确保Steam数据目录的所有权 |
| 主机挂载中出现root拥有的文件 | 使用--user root运行容器 | 移除--user;使用PUID/PGID环境变量 |
SteamCMD支持和认证登录。尽可能使用登录。
bashdocker run --rm \ -e PUID=$(id -u) -e PGID=$(id -g) \ -v "$PWD/steam-app:/home/steam/.local/share/Steam" \ -v "$PWD/server-data:/data" \ gameservermanagers/steamcmd:latest \ +force_install_dir /data +login anonymous +app_update 4020 +quit
某些应用(如特定私有分支、工具或测试版仓库)需要Steam账户。
无状态(无持久Steam数据)
首次使用几乎总会触发Steam Guard,之后也可能再次触发,因为没有数据持久化:
bashdocker run --rm \ -e PUID=$(id -u) -e PGID=$(id -g) \ -v "$PWD/server-data:/data" \ gameservermanagers/steamcmd:latest \ +@ShutdownOnFailedCommand 1 +force_install_dir /data \ +login "${STEAM_USER}" "${STEAM_PASS}" +app_update 223350 +quit
持久化(推荐)
持久化/home/steam/.local/share/Steam,使sentry(guard)文件被缓存,后续运行无需代码提示。
bashdocker run --rm \ -e PUID=$(id -u) -e PGID=$(id -g) \ -v "$PWD/steam-app:/home/steam/.local/share/Steam" \ -v "$PWD/server-data:/data" \ gameservermanagers/steamcmd:latest \ +@ShutdownOnFailedCommand 1 \ +force_install_dir /data \ +login "${STEAM_USER}" "${STEAM_PASS}" +app_update 223350 +quit
建议:
+login user pass CODE(第三个参数),或交互式运行一次以在挂载的Steam目录中缓存sentry文件。可在镜像名称后链式添加的常用命令/标志(顺序重要;见下方说明):
| 命令/标志 | 用途 | 示例片段 |
|---|---|---|
+login anonymous | ***登录(大多数专用服务器支持) | +login anonymous |
+login <user> <pass> | 认证登录(某些应用/私有测试版需要) | +login myuser mypass |
+@NoPromptForPassword 1 | 抑制交互式密码/Guard提示(快速失败) | +@NoPromptForPassword 1 +login myuser mypass |
+@ShutdownOnFailedCommand 1 | 若命令失败则中止剩余命令 | +@ShutdownOnFailedCommand 1 |
+force_install_dir <path> | 设置应用文件目标目录(必须在+app_update之前) | +force_install_dir /data |
+app_update <appid> | 安装或更新应用(服务器/游戏) | +app_update 896660 |
+app_update <appid> validate | 完整性检查并重新下载缺失/损坏文件(较慢) | +app_update 740 validate |
+app_status <appid> | 打印安装状态/进度(调试) | +app_status 896660 |
+app_info_update 1 | 刷新应用信息缓存(查询详情前使用) | +app_info_update 1 |
+workshop_download_item <appid> <itemid> | 下载特定创意工坊项目 | +workshop_download_item 4020 3418671232 |
+download_depot <appid> <depotid> <manifest> | 获取特定仓库/清单(版本固定) | +download_depot 90 90 402078904020789 |
+sSteamCmdForcePlatformType <os> | 强制内容平台(Linux/Windows/macOS) | +sSteamCmdForcePlatformType windows |
+runscript <file> | 从脚本文件执行命令批处理 | +runscript /scripts/install.txt |
+quit | 完成前序命令后退出steamcmd | +quit |
+@ShutdownOnFailedCommand 1 +@NoPromptForPassword 1 +force_install_dir /data +login ... +app_update <appid> validate +quit+force_install_dir必须放在第一个+app_update之前,否则文件会进入默认库(/home/steam/Steam/steamapps)。validate;仅在初始安装或怀疑损坏时使用。+runscript);每行应镜像内联形式(无shell引用问题)。+download_depot可能需要认证登录和正确的分支访问权限;清单是版本特定的。Q: 如何查找appid?
搜索SteamDB并使用显示的数字App ID。
Q: 为什么出现"连接失败"或SSL错误?
通常是临时网络问题或防火墙DPI干扰。重试,或确保出站TCP 27015/27036和HTTPS端口开放。
Q: 能否在一次容器调用中运行多个更新?
可以,链式添加多个+app_update命令或使用包含每行一个命令的运行脚本文件。
Q: 是否需要暴露端口?
下载内容不需要。游戏服务器端口由使用下载文件构建/运行的单独服务器容器处理。
此容器基于https://github.com/steamcmd/docker%E5%AE%B9%E5%99%A8%EF%BC%8C%E4%B8%BB%E8%A6%81%E7%94%A8%E4%BA%8ELinuxGSM%E6%B8%B8%E6%88%8F%E6%9C%8D%E5%8A%A1%E5%99%A8%E3%80%82


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