Docker部署Flask应用遇端点访问失败问题求助
问题描述
我创建了如下Docker镜像:
FROM ubuntu:20.04 WORKDIR /app COPY . /app ENV DEBIAN_FRONTEND=noninteractive RUN apt-get update && \ apt-get install -y wget && \ apt-get install -y libgtk2.0-dev RUN mkdir -p ~/miniconda3 RUN wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O miniconda.sh && \ bash miniconda.sh -b -p /opt/miniconda && \ rm miniconda.sh ENV PATH /opt/miniconda/bin:$PATH COPY environment.yaml /app/environment.yaml RUN conda env create -f /app/environment.yaml CMD ["/bin/bash", "-c", "source /opt/miniconda/etc/profile.d/conda.sh && conda activate my-env && python APIWrapper.py"]
运行镜像后容器成功启动,Flask应用显示正常运行,但测试/extract端点时出现连接重置错误:
$ curl http://127.0.0.1:5000/extract?contractPath=/app/input/AWS.pdf curl: (56) Recv failure: Connection reset by peer
已尝试端口映射和挂载文件卷,但均未解决问题。
排查与解决方案
1. 修正Flask绑定地址
Flask默认仅绑定127.0.0.1,仅容器内部可访问,外部请求会触发连接重置。需在Flask启动代码中明确绑定0.0.0.0:
if __name__ == '__main__': app.run(host='0.0.0.0', port=5000)
2. 检查请求处理时的进程崩溃
连接重置常因Flask处理/extract请求时进程崩溃导致,可通过以下方式排查:
- 查看容器日志:执行
docker logs <容器ID>,检查处理请求时的报错信息(如文件缺失、依赖错误、内存溢出等) - 容器内本地测试:执行
docker exec -it <容器ID> bash进入容器,再用curl http://127.0.0.1:5000/extract?contractPath=/app/input/AWS.pdf测试,获取具体错误输出
3. 优化Conda环境启动逻辑
当前CMD用bash子shell激活环境,可能存在环境变量传递问题,可改用直接调用conda环境的Python:
CMD ["/opt/miniconda/envs/my-env/bin/python", "APIWrapper.py"]
也可以在environment.yaml中指定环境前缀:prefix: /opt/miniconda/envs/my-env,避免手动激活环境的潜在问题。
4. 验证文件权限
确认挂载的/app/input/AWS.pdf在容器内的读取权限:
- 进入容器执行
ls -l /app/input/AWS.pdf查看权限 - 若权限不足,可在Dockerfile中添加:
RUN chmod -R 755 /app/input(按需调整权限)
5. 确认端口映射正确性
再次验证容器启动命令的端口映射是否正确,确保本地端口与容器端口对应且未被占用:
docker run -p 5000:5000 -v /本地输入路径:/app/input <镜像名>
内容的提问来源于stack exchange,提问作者Jensen Jose
相关产品推荐
相关产品推荐

