You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker容器使用Attach_Socket发送输入不换行且无法获取输出问题

解决方案

核心问题根源

  • Python 默认在非交互环境启用块缓冲,输出内容不会实时刷新到标准流,导致日志无法即时采集、输出内容拼接
  • 未分配伪终端(TTY),无输入回显逻辑
  • 输入内容未携带换行符,程序未触发输入读取逻辑
  • attach 仅绑定了输入流,未监听输出流

具体修改步骤

1. 修改run.sh配置

修正 shebang 路径,给 Python 启动添加-u参数禁用输出缓冲:

#!/usr/bin/env bash
timeout --signal=SIGTERM --foreground 500 python3 -u main.py
exit $?

如果需要更稳妥的即时输出,可以在main.py的所有print语句中添加flush=True参数,例:

print("Enter your name", flush=True)
name = input()
print(f"you entered {name}", flush=True)

2. 修改Docker SDK调用逻辑

  • 创建容器时开启伪终端分配,启用标准输出/错误流采集
  • 发送输入时追加换行符,匹配Python输入函数的行结束规则
  • attach时同时绑定输入、输出、错误流,可实时读取返回内容

修改后代码示例:

import docker
import time

client = docker.from_env()
client.images.build(path="./Dockerimagefolder/", tag="sample322")

container = client.containers.create(
    image="sample322",
    stdin_open=True,
    tty=True,
    stdout=True,
    stderr=True
)
container.start()
time.sleep(5)

s = container.attach_socket(params={
    'stdin': 1,
    'stdout': 1,
    'stderr': 1,
    'stream': 1
})

# 发送输入时追加换行
s.send('test\n'.encode())

# 实时读取输出
output = b""
while True:
    try:
        chunk = s.recv(4096)
        if not chunk:
            break
        output += chunk
    except Exception:
        break
print("实时输出:", output.decode())

# 此时调用logs()可正常获取完整日志
print("容器全量日志:", container.logs().decode())

内容的提问来源于stack exchange,提问作者xineta5158

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 05:24:03