Docker部署Flask应用运行卡顿、请求后冻结及文件修改无法同步问题咨询
问题1:应用运行卡顿、跳转无响应故障定位与修复
根因
- Flask默认自带的Werkzeug开发服务器为单线程模式,同一时间仅能处理1个请求,前序请求未完全释放连接时,后续请求会直接阻塞,就会出现跳转无响应的情况。你在宿主机本地运行时大概率开启了多线程/debug模式,手动在Docker容器内启动时未加对应参数就会触发该问题。
- 你当前docker-compose配置中web服务的启动命令为
tail -f /dev/null,仅做容器保活用,需要手动exec进入容器启动服务,没有固定启动参数也容易出现配置不一致的问题。
修复方案
启动Flask时添加多线程参数,两种实现方式二选一即可:
- 代码层面修改启动逻辑:
if __name__ == '__main__': app.run(host="0.0.0.0", port=5000, threaded=True)
- 命令行启动时加参数:
flask run --host=0.0.0.0 --port=5000 --threaded
另外可以直接把启动命令写到docker-compose里,避免手动启动的配置偏差:把web服务下的command: tail -f /dev/null替换为command: flask run --host=0.0.0.0 --port=5000 --threaded即可。
问题2:本地文件修改容器内不同步故障定位与修复
根因
挂载路径完全不匹配:
- Dockerfile中定义的工作目录为
/base,构建镜像时你把本地./app目录下的代码复制到了容器内的/base/app路径下,你的应用实际读取的是该路径下的代码 - docker-compose中你配置的卷挂载规则为
${PWD}/app/:/usr/src/app/,是把本地代码挂载到了容器的/usr/src/app路径,该路径根本没有被应用读取,修改本地文件自然不会同步到应用生效的目录
修复方案
修改docker-compose的卷挂载路径,和镜像内的代码路径保持一致:
把web服务下的volumes配置改成:
volumes: - ${PWD}/app/:/base/app/ # 如果需要修改根目录下的base_app.py、config.py等文件也同步,再额外加对应的挂载规则即可,比如: - ${PWD}/base_app.py:/base/base_app.py - ${PWD}/config.py:/base/config.py
修改后重启docker-compose服务即可生效,后续本地修改app目录下的代码会直接同步到容器内应用读取的路径。
内容的提问来源于stack exchange,提问作者bobi
相关产品推荐
相关产品推荐

