Docker部署Flask API报错:导入'app'时触发ImportError如何解决
Flask API Docker部署ImportError问题解决方案
核心问题原因
- 依赖冲突:
requirements.txt中单独安装的bson==0.5.10包和pymongo内置的bson模块冲突,pymongo已经自带bson实现,不需要单独安装,独立安装的bson包不含json_util方法,会触发导入错误。 - 不必要文件复制:项目中的本地虚拟环境
venv文件夹被复制进Docker镜像,和镜像内的Python环境产生冲突。 - 未显式指定Flask入口:Docker运行环境未显式设置
FLASK_APP变量,可能出现入口识别异常。
具体解决步骤
1. 修改依赖配置
删除requirements.txt中的bson==0.5.10行,修改后的requirements.txt内容如下:
click==8.0.3 colorama==0.4.4 Flask==2.0.2 Flask-Cors==3.0.10 Flask-PyMongo==2.3.0 itsdangerous==2.0.1 Jinja2==3.0.2 MarkupSafe==2.0.1 pymongo==3.12.1 python-dateutil==2.8.2 six==1.16.0 Werkzeug==2.0.2
2. 新增.dockerignore文件
在项目根目录创建.dockerignore文件,过滤不需要复制到镜像的本地文件:
venv/ __pycache__/ *.pyc *.pyo *.pyd .env .git .gitignore
3. 修改Dockerfile配置
显式设置Flask环境变量,避免入口识别异常,可按需选择启动方式:
FROM python:3.8-slim-buster WORKDIR /api # 显式指定Flask入口 ENV FLASK_APP=app.py ENV FLASK_ENV=production COPY requirements.txt requirements.txt # 加--no-cache-dir减少镜像体积 RUN pip3 install --no-cache-dir -r requirements.txt COPY . . # 开发调试用flask run CMD [ "python3", "-m" , "flask", "run", "--host=0.0.0.0"] # 生产环境建议替换为gunicorn,先在requirements.txt加gunicorn==20.1.0,再用下面的CMD # CMD ["gunicorn", "--bind", "0.0.0.0:5000", "app:app"]
4. 重新构建启动镜像
执行以下命令重新构建并启动容器:
# 构建镜像 docker build -t flask-api . # 启动容器,端口映射可按需修改 docker run -p 5000:5000 flask-api
额外说明
本地环境能正常运行是因为本地虚拟环境的依赖安装顺序和Docker内不同,优先调用了pymongo内置的bson模块,未触发冲突。
内容的提问来源于stack exchange,提问作者PlaeschZ
相关产品推荐
相关产品推荐

