如何向Docker镜像中的游戏服务器标准输入发送命令
解决方案
一、Python 实现方案(跨Windows/Linux)
1. 使用 docker-python SDK
直接通过SDK的attach_socket实现双向通信,无需修改镜像,跨平台兼容:
import docker # 初始化Docker客户端 client = docker.from_env() # 获取目标容器(替换为你的容器名称或ID) container = client.containers.get("game-server-container") # 建立带stdin/stdout的连接 attach_conn = container.attach_socket(params={ 'stdin': True, 'stdout': True, 'stderr': False, 'stream': True }) # 发送status命令(必须加换行符触发执行) attach_conn._sock.send(b'status\n') # 读取并打印服务器状态输出 for chunk in attach_conn: print(chunk.decode('utf-8').strip()) # 关闭连接 attach_conn.close()
2. 使用 Python on Whales
封装更友好的API,代码更简洁:
from python_on_whales import docker # 获取目标容器(替换为你的容器名称或ID) container = docker.container.inspect("game-server-container") # 开启交互式attach会话 with docker.container.attach( container.id, stdin=True, stdout=True, stderr=False, stream=True ) as streams: # 发送命令并刷新输入流 streams.stdin.write(b'status\n') streams.stdin.flush() # 读取输出内容 for line in streams.stdout: print(line.decode('utf-8').strip())
二、跨平台Shell方案
无需Python依赖,直接用原生Docker命令:
Linux/macOS(Bash)
# 发送status命令并读取输出,自动退出连接 (echo "status"; sleep 1) | docker attach game-server-container 2>/dev/null
Windows(PowerShell)
# 发送带换行符的命令到容器stdin "status`n" | docker attach game-server-container
关键注意事项
- 容器必须处于运行状态,且启动时未禁用stdin(默认开启,除非启动时指定
--interactive=false) - 命令必须携带换行符(
\n),模拟终端回车触发执行 - 若需多次发送命令,保持attach连接打开即可,无需重复建立连接
内容的提问来源于stack exchange,提问作者Shane Volpe
相关产品推荐
相关产品推荐

