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

Flask中Docker容器输出作为POST请求响应遇连接拒绝问题

问题分析与解决方案

1. 修正代码基础问题

你的代码存在两个核心问题,是引发连接拒绝的主要原因:

  • 导入位置错误:import docker和import os放在了if __name__ == '__main__':之后,Flask的debug模式会自动重载代码,重载后这些导入不会执行,导致找不到dockersandbox函数,直接引发服务中断。
  • 文件句柄未释放:直接用open()写文件后未关闭,可能导致文件内容未及时写入磁盘,Docker容器读取空文件或被锁定的文件,进而阻塞请求处理,最终导致连接超时断开。

修正后的完整代码:

from flask import Flask, request
import docker
import os

app = Flask(__name__)

@app.get('/run')
def test():
    return 'running'

@app.post('/run')
def handle_request():
    lang='python'
    language = request.data
    code=language.decode('utf-8')
    
    # 使用with语句自动关闭文件,确保内容写入磁盘
    filename = 'input.py' if lang == 'python' else 'input.cpp'
    with open(filename, 'w') as file:
        file.write(code)
    
    output = dockersandbox()
    return output

def dockersandbox():
    image = 'myimage'
    client = docker.from_env()
    
    container = client.containers.run(
        image=image,
        volumes={os.getcwd(): {'bind': '/container/files', 'mode': 'rw'}},
        remove=True,
        stdout=True,
        stderr=True  # 捕获错误输出,方便排查容器内执行问题
    )
    output = container.decode('utf-8')
    return output

if __name__ == '__main__':
    app.run(debug=True)

2. 解决Debug模式重载冲突

Flask debug模式的自动重载功能,可能在Docker容器运行期间重启服务,导致客户端连接被强制断开。可以采取两种方式处理:

  • 关闭debug模式:将app.run(debug=True)改为app.run(debug=False),重启服务测试。
  • 保留debug但禁用重载:
    app.run(debug=True, use_reloader=False)
    

3. 处理容器执行超时问题

如果脚本或代码执行时间较长,Flask默认请求超时会触发连接断开。可以:

  • 在containers.run中添加超时参数,限制容器运行时间:
    container = client.containers.run(
        # 其他参数
        timeout=30  # 设置30秒超时,可根据实际调整
    )
    
  • 若使用第三方WSGI服务器(如gunicorn),需同步调整服务器的超时配置。

4. 验证Docker镜像执行逻辑

手动执行容器命令,确认镜像内的启动命令确实会读取/container/files下的文件并输出结果:

docker run --rm -v $(pwd):/container/files myimage

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 16:25:20