You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker-Compose启动Flask容器失败,手动运行Docker容器却成功

问题:Docker-Compose启动Flask容器失败,手动启动正常?

我正在学习Flask及Docker化部署一个测试Flask博客项目,为了实现uWSGI无需重启容器即可重载,配置了Docker卷。使用docker-compose up启动nginx和Flask两个容器时,nginx启动成功,但Flask容器报错:

realpath() of flaskblog/uwsgi.ini failed: No such file or directory [core/utils.c line 3662]

并退出。但手动运行该容器时,能确认flaskblog/uwsgi.ini文件存在,且手动执行uwsgi命令可正常启动服务。

项目结构

[wintermute]$ tree -L 2 --gitignore
.
├── app.py
├── docker-compose.yml
├── flaskblog
│	├── config.py
│	├── dev
│	├── Dockerfile
│	├── errors
│	├── __init__.py
│	├── instance
│	├── logging_test.py
│	├── main
│	├── models.py
│	├── posts
│	├── static
│	├── templates
│	├── users
│	└── uwsgi.ini
├── instance
│	├── site.db
├── nginx
│	├── Dockerfile
│	└── nginx.conf
└── requirements.txt

flaskblog/Dockerfile内容

FROM python:3.11
ENV LANG=C.UTF-8
WORKDIR /app
COPY app.py requirements.txt /app
RUN pip install --no-cache-dir -r /app/requirements.txt
RUN pip install itsdangerous==2.0.1
WORKDIR /app/flaskblog
COPY flaskblog/ /app/flaskblog/
WORKDIR /app/instance
COPY instance/site.db /app/instance
WORKDIR /app
EXPOSE 8003
CMD [ "uwsgi", "flaskblog/uwsgi.ini" ]

docker-compose.yml内容

version: '3.7'
services:
  flask:
    build:
      context: .
      dockerfile: ./flaskblog/Dockerfile
    container_name: flask
    restart: "no"
    environment:
      - APP_NAME=MyFlaskApp
    expose:
      [ 8003 ]
    cap_add:
        - SYS_PTRACE
    volumes:
      - ./flaskblog:/app

  nginx:
    build: ./nginx
    container_name: nginx
    restart: "no"
    ports:
      - "8083:8083"
    cap_add:
        - SYS_PTRACE

问题原因及解决方法

问题出在Docker卷挂载路径错误:

  • 在docker-compose.yml中,你把本地的./flaskblog目录挂载到了容器的/app目录下。
  • 根据Dockerfile的构建逻辑,容器内的/app目录原本包含app.py、requirements.txt,以及子目录flaskblog和instance。
  • 挂载后,容器内的/app被本地的flaskblog目录完全覆盖,导致原本的/app/flaskblog路径变成了/app/flaskblog/flaskblog,uWSGI找不到指定的flaskblog/uwsgi.ini文件。

解决步骤

  1. 修改docker-compose.yml中的卷挂载配置,将本地的./flaskblog挂载到容器内的/app/flaskblog,而非/app:
volumes:
  - ./flaskblog:/app/flaskblog

这样既可以实现代码热重载需求,又不会破坏容器内的/app根目录结构。

  1. 重新构建并启动容器:
docker-compose down
docker-compose up --build

验证:启动后,容器内的/app/flaskblog/uwsgi.ini路径会正确映射本地文件,uWSGI可以正常读取配置文件启动服务。

内容的提问来源于stack exchange,提问作者groknaut

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 22:12:43