修复 Gunicorn "no module found named index.py in import_app" 错误

Fixing Gunicorn "no module found named index.py in import_app" error

我正在Windows Linux Docker 容器中工作。我正在尝试通过 Docker 容器中的 Gunicorn 运行 Flask 应用程序(使用 docker-compose)。 Web 应用程序不断从 import_app 函数退出,状态为 8。

我试过 运行ning 命令行作为管理员,我试过更改 docker-compose 文件中的 运行 命令,我也试过尝试 运行 在没有它的情况下完成我的项目的其余部分。 None 其中有效。

更新: 我试过更改端口,更改文件名 (index.py),为 Python 重新安装 Docker 图像,p运行ing 我的旧 docker 容器,在 docker-compose 中添加 Python 路径,以及

docker-compose.yml :

version: '3'
services:
    web:
        build: .
        command: gunicorn "index:app" -b 0.0.0.0:8080
        ports:
            - "8888:8080"
        volumes:
            - .:/code
        depends_on:
            - redis
    redis:
        image: redis

然后是控制台回溯:

web_1    | [2018-12-19 20:36:50 +0000] [8] [ERROR] Exception in worker process
web_1    | Traceback (most recent call last):
web_1    |   File "/usr/local/lib/python3.7/site-packages/gunicorn/arbiter.py", line 583, in spawn_worker
web_1    |     worker.init_process()
web_1    |   File "/usr/local/lib/python3.7/site-packages/gunicorn/workers/base.py", line 129, in init_process
web_1    |     self.load_wsgi()
web_1    |   File "/usr/local/lib/python3.7/site-packages/gunicorn/workers/base.py", line 138, in load_wsgi
web_1    |     self.wsgi = self.app.wsgi()
web_1    |   File "/usr/local/lib/python3.7/site-packages/gunicorn/app/base.py", line 67, in wsgi
web_1    |     self.callable = self.load()
web_1    |   File "/usr/local/lib/python3.7/site-packages/gunicorn/app/wsgiapp.py", line 52, in load
web_1    |     return self.load_wsgiapp()
web_1    |   File "/usr/local/lib/python3.7/site-packages/gunicorn/app/wsgiapp.py", line 41, in load_wsgiapp
web_1    |     return util.import_app(self.app_uri)
web_1    |   File "/usr/local/lib/python3.7/site-packages/gunicorn/util.py", line 350, in import_app
web_1    |     __import__(module)
web_1    | ModuleNotFoundError: No module named 'index'
web_1    | [2018-12-19 20:36:50 +0000] [8] [INFO] Worker exiting (pid: 8)
web_1    | [2018-12-19 20:36:50 +0000] [1] [INFO] Shutting down: Master
web_1    | [2018-12-19 20:36:50 +0000] [1] [INFO] Reason: Worker failed to         boot.
flaskpython_web_1 exited with code 3

Docker文件:

FROM python:3

# set environment variables
ENV PYTHONUNBUFFERED 1
ENV FLASK_APP=index.py

# copy current directory into working directory
COPY . /code
WORKDIR /code

# install python packages
RUN pip install -r requirements.txt

expose 8080

CMD ["gunicorn", "index:app", "-b", "0.0.0.0:8080"]

最后是项目结构:

|docker-compose.yml
|Dockerfile
|index.py
|requirements.txt

预期的结果是网络服务器不会崩溃或随着所有工作人员的退出而退出。我想让它认识到索引是我进入项目其余部分的入口点。

Gunicorn 将在容器内的 PYTHONPATH 上寻找 index.py。尝试将 PYTHONPATH 设置为 docker-compose.yml:

中的环境变量
version: '3'
services:
    web:
        build: .
        command: gunicorn "index:app" -b 0.0.0.0:8080
        environment:
            PYTHONPATH: '/code'
        ...

这似乎特定于 docker for windows。查看 here 以获取有关它的讨论。简而言之,docker-machine 默认挂载 C:\users\[USERNAME],因此挂载位于其他地方的位置将不起作用 - 这将导致绑定挂载为空。

至于解决方案,您有以下几种选择:

  • 从 docker-compose 文件中删除卷选项。这应该没问题,因为您已经将所需的一切添加到 Dockerfile.

  • 中的图像中
  • 将您的项目放在您的主目录中的某处,C:\users\[USERNAME],然后 运行 那里的所有内容。

  • 转到 docker 设置并将共享驱动器设置为您需要的,可能是 C。更多详情 here.