Flask容器必须设host='0.0.0.0'并显式声明ports映射,依赖服务需健康检查或重试连接,环境变量须手动读取,volume挂载需避免覆盖static目录。

docker-compose.yml 里 Flask 服务必须显式暴露端口
Flask 默认只监听 127.0.0.1:5000,容器内运行时若不改绑定地址,外部根本连不上。Docker Compose 不会自动转发未声明的端口。
- 必须在
app.run()中加host='0.0.0.0',否则容器内只响应 localhost 请求 -
docker-compose.yml的ports字段不能省:写成- "5000:5000",不是- "5000"(后者只映射内部端口,不对外暴露) - 别依赖
EXPOSE指令——它只是文档性质,不影响实际端口映射
依赖服务(如 PostgreSQL)启动顺序不可靠
Flask 容器启动时,PostgreSQL 容器可能还没 ready,直接连接会报 ConnectionRefusedError 或 psycopg2.OperationalError。
-
depends_on只控制启动顺序,不等待服务就绪;必须自己加健康检查或重试逻辑 - 推荐在 Flask 启动脚本里用
time.sleep(2)+ 简单socket.connect()尝试,比等固定秒数更稳 - PostgreSQL 镜像支持
healthcheck,可在docker-compose.yml中配:interval: 30s、timeout: 3s、retries: 3
环境变量从 .env 文件注入但被 Flask 忽略
Flask 本身不读取 .env 文件,docker-compose.yml 里的 env_file 字段只传给容器,不自动加载进 Python 进程。
快速生成专业的 Python 脚本和应用代码。一键创建完整项目结构,支持CLI、API、爬虫、Bot、Django等多种项目类型,包含完整的项目结构、配置文件、依赖管理、测试、README和文档。
- 确保 Flask 应用用
os.getenv('DB_URL')读取,而不是硬编码或依赖python-dotenv自动加载(除非你显式调用load_dotenv()) -
env_file路径是相对于docker-compose.yml的,写错路径会导致变量为空字符串 - 开发时本地跑
flask run和容器里行为不一致——因为本地没走 Compose 的 env_file 加载流程
静态文件 404 是因为 WORKDIR 和 volume 挂载冲突
用 volume 挂载本地代码到容器,但 WORKDIR /app 下已有构建时复制的静态文件,挂载会覆盖整个目录,导致 static/ 被清空。
立即学习“Python免费学习笔记(深入)”;
- 要么把
volume改成只挂载源码(如./app:/app/app),留出/app/static不被覆盖 - 要么在 Dockerfile 里删掉
COPY . /app,完全依赖 volume 挂载,但需确保本地有static/目录 - Flask 开发模式下
app.static_folder默认指向./static,挂载后路径没变,但内容丢了——错误现象就是 CSS/JS 返回 404
容器编排真正卡住人的地方,从来不是 YAML 语法,而是服务间时序、路径可见性、以及 Python 进程对环境变量的真实感知方式——这些细节不验证到日志里,光看配置永远以为“应该能行”。

















