EC2上Docker容器间HTTP POST请求出现内部服务器错误求助
基于你描述的场景(同一EC2实例下Host网络模式的三个容器,Node调用Flask POST接口返回500错误,本地测试正常),可以从以下几个方向排查:
验证Flask接口的访问地址配置
确认Node代码中urlProxy.predict的实际值:本地测试时你用EC2公网IP访问Flask,但在EC2内部的Node容器中,Host网络模式下应该通过localhost:5000或127.0.0.1:5000访问Flask。如果redirectMapping中配置的是EC2公网IP,可能会因为网络路由或安全组限制导致请求失败。可以在Node容器内执行curl -X POST localhost:5000/[你的接口路径] -F "image=@/assets/images/[测试图片名]"直接测试连通性。查看Flask容器的详细错误日志
内部服务器错误(500)的根源在Flask服务端,直接查看KlemFlask容器的日志:docker logs KlemFlask重点关注文件接收、处理环节的报错,比如是否存在:
- 未正确配置
multipart/form-data解析 - 处理图片时的权限问题
- 代码中的未捕获异常
- 未正确配置
检查Node容器内的文件路径与权限
确认Node容器内/assets/images目录存在,且image.filename对应的文件确实存在并拥有读取权限:# 进入Node容器 docker exec -it klemweb sh # 检查文件 ls -l /assets/images/[你的测试图片名]如果文件不存在或权限不足,会导致
fs.createReadStream生成空流,Flask接收到无效文件后抛出错误。调整容器启动依赖顺序
当前Node容器仅依赖DB启动,未依赖Flask容器。虽然Host网络下容器启动后端口会绑定到主机,但Flask服务可能需要更长时间初始化。可以修改任务定义,给klemweb容器添加对KlemFlask的依赖:"dependsOn": [ { "containerName": "klemdb", "condition": "START" }, { "containerName": "KlemFlask", "condition": "START" } ]避免Node在Flask未就绪时发起请求。
检查任务定义的语法正确性
你提供的任务定义中,KlemFlask的容器配置多了一个冗余的},可能导致容器启动异常。修正后的配置片段:{ "name": "KlemFlask", "image": "klemrepo:latest", "cpu": 0, "memoryReservation": 128, "portMappings": [ { "containerPort": 5000, "hostPort": 5000, "protocol": "tcp" } ], "essential": true, "environment": [], "mountPoints": [], "volumesFrom": [] }临时增强Flask的错误反馈
排查期间,可以在Flask接口中添加异常捕获,返回具体错误信息:from flask import Flask, request, jsonify app = Flask(__name__) @app.route('/predict', methods=['POST']) def predict(): try: # 原处理逻辑 image = request.files['image'] # ... 处理代码 return jsonify({"result": "success"}) except Exception as e: return jsonify({"error": str(e)}), 500这样Node端就能拿到具体错误内容,快速定位问题。
内容的提问来源于stack exchange,提问作者Deepanshu Narwat

