Docker部署Flask应用启动Gunicorn报错:找不到'app'模块
Flask容器启动报错:ModuleNotFoundError: No module named 'app'
问题描述
执行以下命令启动容器化Python Flask应用:
docker build -t python_offerte_test_v1:latest . docker-compose up web_prod
运行后出现错误:
ModuleNotFoundError: No module named 'app'
同事运行相同代码可正常启动,但我的容器内/home/code目录为空。
目录结构
- DOCKER-PYTHON - offerte_scanner - server.py - app.py - docker-compose.yaml - Dockerfile
Dockerfile内容
FROM python:3.8 as python RUN pip install poetry RUN mkdir /home/code ADD ./* /home/code # install dependencies RUN apt-get update \ && apt-get -y install tesseract-ocr \ && apt-get -y install ffmpeg libsm6 libxext6 # required for opencv\ && apt-get libmagickwand-dev --no-install-recommends && rm -rf /var/lib/apt/lists/* \ && apt-get pecl install imagick-6.9 \ && apt-get docker-php-ext-enable imagick\ && apt-get install tesseract-ocr-eng #for english #init Poetry WORKDIR /home/code RUN poetry config virtualenvs.create false --local RUN poetry install --only main RUN apt-get update && apt-get -y install ghostscript && apt-get clean #Set ImageMagick settings with policy.xml RUN sed -i 's/^.*policy.*coder.*none.*PDF.*//' /etc/ImageMagick-6/policy.xml COPY policy.xml /etc/ImageMagick-6/
docker-compose.yaml内容
version: '3' services: web_prod: container_name: python_backend_offerte_scanner ports: - "5555:5000" volumes: - .:/code/home restart: always image: python_offerte_test_v1:latest working_dir: /code/home environment: IP_ELASTICSEARCH: <my ip> command: python -m gunicorn -w 2 -b 0.0.0.0:5555 app:app
app.py内容
from offerte_scanner.server import app if __name__ == "__main__": app.run(host="0.0.0.0", debug=True)
问题分析
- 容器内
/home/code为空:Dockerfile中ADD ./* /home/code仅复制当前目录下的文件,不会包含子目录(如offerte_scanner),若当前目录存在匹配规则外的文件(比如被.gitignore排除),会导致复制失败。 - ModuleNotFoundError:
- docker-compose的gunicorn命令格式错误,
python -m属于冗余写法,会导致命令执行逻辑异常; - 挂载本地目录
./:/code/home后,若本地目录与镜像内代码结构、依赖路径不匹配,会引发模块查找失败。
- docker-compose的gunicorn命令格式错误,
解决方案
1. 修复Dockerfile的文件复制逻辑
将ADD ./* /home/code替换为COPY . /home/code,确保复制当前目录下所有文件和子目录:
# 替换原ADD命令 COPY . /home/code
2. 修正gunicorn启动命令
去掉冗余的python -m,调整docker-compose中的command字段:
command: gunicorn -w 2 -b 0.0.0.0:5555 app:app
3. 统一工作目录(可选)
若无需本地代码实时挂载,可移除volumes配置,直接使用镜像内的代码目录,避免路径冲突:
# 移除本地挂载配置 # volumes: # - .:/code/home # 调整工作目录为镜像内代码路径 working_dir: /home/code
4. 验证修复结果
重新构建镜像并启动容器:
docker build -t python_offerte_test_v1:latest . docker-compose up web_prod
内容的提问来源于stack exchange,提问作者Bruno Seriese
相关产品推荐
相关产品推荐

