使用docker-compose运行Flask服务无法定位app.py问题问询
问题核心原因
- 你配置的volumes挂载覆盖了镜像内的
/app目录内容,是报错的根本原因:
你在docker-compose.dev.yml的api服务中配置了- ./:/app,作用是将宿主机当前目录(即foo/)直接挂载到容器内的/app路径,会完全覆盖构建阶段你复制到/app下的所有backend目录文件。
挂载后容器内/app路径的内容和宿主机foo/完全一致,结构如下:
Flask默认在工作目录/app/ backend/ Dockerfile app.py requirements.txt frontend/ docker-compose.dev.yml/app下找app.py,自然找不到对应文件,你之前设置的FLASK_APP=app.py也是指向/app/app.py,实际文件在/app/backend/app.py,所以依然会触发导入失败的报错。 - 前端服务正常运行的原因是你没有给frontend服务配置任何volumes挂载,启动时直接使用构建阶段复制到镜像内
/app的前端文件,不会被外部内容覆盖。
解决方案
以下三种方案任选其一即可:
方案1:修改挂载路径(推荐,适合开发热更新)
仅挂载backend目录到容器内的/app路径,修改docker-compose.dev.yml中api服务的volumes配置:
version: '3.8' services: api: build: context: ./backend/ ports: - 5000:5000 volumes: - ./backend:/app
修改后宿主机backend目录下的代码修改会实时同步到容器内,不需要重新构建镜像就能生效。
方案2:移除volumes挂载
如果不需要开发热更新,直接使用构建好的镜像内的文件,删掉api服务下的volumes配置即可:
version: '3.8' services: api: build: context: ./backend/ ports: - 5000:5000
方案3:保留现有挂载规则,修改FLASK_APP路径
如果确实需要挂载整个foo目录到容器/app,只需将FLASK_APP指向实际的app.py路径即可,比如在Dockerfile中修改:
ENV FLASK_APP=backend/app.py
或者在env文件中设置FLASK_APP=backend/app.py。
内容的提问来源于stack exchange,提问作者Caleb Jay
相关产品推荐
相关产品推荐

