基于Ubuntu镜像的Flask Docker容器断点调试问题求助
解决Docker中Flask应用的断点调试问题
你当前的Dockerfile存在几个核心问题,直接导致调试失败:
- 激活虚拟环境前未创建venv,
./venv/bin/activate不存在,这一步实际执行失败,依赖可能没安装到虚拟环境中 - debugpy默认只监听localhost,容器外部无法连接调试端口
- 未配置debugpy接管应用启动,也没暴露调试端口
以下是修改后的完整Dockerfile及分步说明:
FROM ubuntu:24.04 # Install required packages and Python RUN apt-get update && \ apt-get install -y python3 python3-pip python3-venv default-libmysqlclient-dev build-essential pkg-config curl && \ rm -rf /var/lib/apt/lists/* # Prevents Python from writing pyc files. ENV PYTHONDONTWRITEBYTECODE=1 # Turns off buffering for easier container logging ENV PYTHONUNBUFFERED=1 # 先创建虚拟环境,再激活并安装依赖 RUN --mount=type=cache,target=/root/.cache/pip \ --mount=type=bind,source=requirements.txt,target=requirements.txt \ python3 -m venv venv && \ . ./venv/bin/activate && \ python3 -m pip install --upgrade pip && \ pip3 install -r requirements.txt && \ pip3 install debugpy COPY . . # 暴露Flask服务端口和debugpy调试端口 EXPOSE 5000 5678 # 用debugpy启动应用,监听所有网卡的5678端口,启动时等待调试客户端连接 CMD ["./venv/bin/python", "-m", "debugpy", "--listen", "0.0.0.0:5678", "--wait-for-client", "app.py"]
关键改动说明:
- 修复虚拟环境流程:添加
python3 -m venv venv命令,确保激活前venv已创建 - debugpy网络配置:
--listen 0.0.0.0:5678:让debugpy监听容器所有网卡,允许外部IDE连接--wait-for-client:启动时暂停,等待调试客户端连接,避免应用直接运行错过断点
- 端口暴露:在
EXPOSE中加入5678,配合容器启动时的端口映射使用
容器运行命令:
必须映射调试端口,否则IDE无法连接:
docker run -p 5000:5000 -p 5678:5678 your-image-name
VS Code调试配置示例:
在项目.vscode/launch.json中添加以下配置:
{ "version": "0.2.0", "configurations": [ { "name": "Docker Flask Debug", "type": "python", "request": "attach", "connect": { "host": "localhost", "port": 5678 }, "pathMappings": [ { "localRoot": "${workspaceFolder}", "remoteRoot": "/" } ] } ] }
调试步骤:
- 构建修改后的镜像:
docker build -t your-image-name . - 运行带端口映射的容器
- 在VS Code中启动上述调试配置
- 在Flask代码中设置断点,发送API请求即可触发断点
内容的提问来源于stack exchange,提问作者ratnesh
相关产品推荐
相关产品推荐

