ken
ken

Reputation: 2682

Flask unable to start server using Docker due to ModuleNotFoundError: No module named 'wsgi'

I now deploy my Flask app using Nginx and Docker. My docker is up and running,but I always get 502 Bad Gateway nginx when going one of the endpoint.

So I remove all docker and build it again,then I getting this error,when running docker-compose up -d:

[2020-03-09 15:00:11 +0000] [1] [INFO] Starting gunicorn 19.7.1
flask        | [2020-03-09 15:00:11 +0000] [1] [INFO] Listening at: http://0.0.0.0:5000 (1)
flask        | [2020-03-09 15:00:11 +0000] [1] [INFO] Using worker: sync
flask        | [2020-03-09 15:00:11 +0000] [7] [INFO] Booting worker with pid: 7
flask        | [2020-03-09 15:00:11 +0000] [7] [ERROR] Exception in worker process
flask        | Traceback (most recent call last):
flask        |   File "/usr/local/lib/python3.6/site-packages/gunicorn/arbiter.py", line 578, in spawn_worker
flask        |     worker.init_process()
flask        |   File "/usr/local/lib/python3.6/site-packages/gunicorn/workers/base.py", line 126, in init_process
flask        |     self.load_wsgi()
flask        |   File "/usr/local/lib/python3.6/site-packages/gunicorn/workers/base.py", line 135, in load_wsgi
flask        |     self.wsgi = self.app.wsgi()
flask        |   File "/usr/local/lib/python3.6/site-packages/gunicorn/app/base.py", line 67, in wsgi
flask        |     self.callable = self.load()
flask        |   File "/usr/local/lib/python3.6/site-packages/gunicorn/app/wsgiapp.py", line 65, in load
flask        |     return self.load_wsgiapp()
flask        |   File "/usr/local/lib/python3.6/site-packages/gunicorn/app/wsgiapp.py", line 52, in load_wsgiapp
flask        |     return util.import_app(self.app_uri)
flask        |   File "/usr/local/lib/python3.6/site-packages/gunicorn/util.py", line 352, in import_app
flask        |     __import__(module)
flask        | ModuleNotFoundError: No module named 'wsgi'
flask        | [2020-03-09 15:00:11 +0000] [7] [INFO] Worker exiting (pid: 7)
flask        | [2020-03-09 15:00:11 +0000] [8] [INFO] Booting worker with pid: 8
flask        | [2020-03-09 15:00:11 +0000] [8] [ERROR] Exception in worker process
flask        | Traceback (most recent call last):
flask        |   File "/usr/local/lib/python3.6/site-packages/gunicorn/arbiter.py", line 578, in spawn_worker
flask        |     worker.init_process()
flask        |   File "/usr/local/lib/python3.6/site-packages/gunicorn/workers/base.py", line 126, in init_process
flask        |     self.load_wsgi()
flask        |   File "/usr/local/lib/python3.6/site-packages/gunicorn/workers/base.py", line 135, in load_wsgi
flask        |     self.wsgi = self.app.wsgi()
flask        |   File "/usr/local/lib/python3.6/site-packages/gunicorn/app/base.py", line 67, in wsgi
flask        |     self.callable = self.load()
flask        |   File "/usr/local/lib/python3.6/site-packages/gunicorn/app/wsgiapp.py", line 65, in load
flask        |     return self.load_wsgiapp()
flask        |   File "/usr/local/lib/python3.6/site-packages/gunicorn/app/wsgiapp.py", line 52, in load_wsgiapp
flask        |     return util.import_app(self.app_uri)
flask        |   File "/usr/local/lib/python3.6/site-packages/gunicorn/util.py", line 352, in import_app
flask        |     __import__(module)
flask        | ModuleNotFoundError: No module named 'wsgi'
flask        | [2020-03-09 15:00:11 +0000] [8] [INFO] Worker exiting (pid: 8)
flask        | [2020-03-09 15:00:11 +0000] [9] [INFO] Booting worker with pid: 9
flask        | [2020-03-09 15:00:11 +0000] [9] [ERROR] Exception in worker process
flask        | Traceback (most recent call last):
flask        |   File "/usr/local/lib/python3.6/site-packages/gunicorn/arbiter.py", line 578, in spawn_worker
flask        |     worker.init_process()
flask        |   File "/usr/local/lib/python3.6/site-packages/gunicorn/workers/base.py", line 126, in init_process
flask        |     self.load_wsgi()
flask        |   File "/usr/local/lib/python3.6/site-packages/gunicorn/workers/base.py", line 135, in load_wsgi
flask        |     self.wsgi = self.app.wsgi()
flask        |   File "/usr/local/lib/python3.6/site-packages/gunicorn/app/base.py", line 67, in wsgi
flask        |     self.callable = self.load()
flask        |   File "/usr/local/lib/python3.6/site-packages/gunicorn/app/wsgiapp.py", line 65, in load
flask        |     return self.load_wsgiapp()
flask        |   File "/usr/local/lib/python3.6/site-packages/gunicorn/app/wsgiapp.py", line 52, in load_wsgiapp
flask        |     return util.import_app(self.app_uri)
flask        |   File "/usr/local/lib/python3.6/site-packages/gunicorn/util.py", line 352, in import_app
flask        |     __import__(module)
flask        | ModuleNotFoundError: No module named 'wsgi'
flask        | [2020-03-09 15:00:11 +0000] [9] [INFO] Worker exiting (pid: 9)
flask        | [2020-03-09 15:00:11 +0000] [1] [INFO] Shutting down: Master
flask        | [2020-03-09 15:00:11 +0000] [1] [INFO] Reason: Worker failed to boot.

So means that my Flask service is failed to build,therefore the application server Nginx is proxying to is not running,according to this answer.But I have no idea where is going wrong.

This is my docker-compose.yml:

  version: '3'
  services:

  flask:
    build:
      context: app
      dockerfile: Dockerfile
    container_name: flask
    image: digitalocean.com/flask-python:3.6
    restart: unless-stopped
    environment:
      APP_ENV: "prod"
      APP_DEBUG: "False"
      APP_PORT: 5000  

  service_2: 
     ...

  service_3:
    ...

This is my app/Dockerfile

FROM python:3.6.8-alpine3.9

WORKDIR /var/www/

ADD . /var/www/
RUN apk add --no-cache build-base libffi-dev openssl-dev ncurses-dev

RUN python -m pip install --upgrade pip
RUN pip install -r requirements.txt // gunicorn is install inside requirements.txt

EXPOSE 5000

CMD [ "gunicorn", "-w", "4", "--bind", "0.0.0.0:5000", "wsgi"]

This is my project directory look like:

home
-project_root
-docker-compose.yml
--app
---all other files
---Dockerfile
---requirements.txt
---wsgi.py

This is my wsgi.py :

import os
from app import create_app
from flask_cors import CORS

app = create_app()
cors = CORS(app)

if __name__ == '__main__':
    ENVIRONMENT_DEBUG = os.environ.get("APP_DEBUG", True)
    ENVIRONMENT_PORT = os.environ.get("APP_PORT", 5000)
    app.run(host='0.0.0.0', port=ENVIRONMENT_PORT, debug=ENVIRONMENT_DEBUG)

What I tried:

According to this answer, I change the CMD in app\Dockerfile from this:

CMD [ "gunicorn", "-w", "4", "--bind", "0.0.0.0:5000", "wsgi"]

To this:

CMD [ "gunicorn", "-w", "4", "--bind", "0.0.0.0:5000", "/home/project_root/app/wsgi.py"]

But the I still getting the same error on top when running docker-compose up -d.I newbie in docker,so totally no idea what is causing the error and what exactly I doing wrong. Somebody please help.

Update:

According to this answer, and the answer below, I tried to run the command like this:

CMD [ "gunicorn", "-w", "4", "--bind", "0.0.0.0:5000", "wsgi:app"]

Still getting the same error.

If I move wsgi.py outside the app folder like this:

home
    -project_root
    -docker-compose.yml
    -wsgi.py
    --app
    ---all other files
    ---Dockerfile
    ---requirements.txt

Also having the same error.

Update 2:

I change the CMD like below:

CMD [ "gunicorn", "-w", "4", "--bind", "0.0.0.0:5000", "/var/www/app/wsgi.py"]

Now I get the error like this:

flask        | ModuleNotFoundError: No module named '/var/www/app/wsgi.py'

Upvotes: 1

Views: 2980

Answers (2)

Nguyen Lam Phuc
Nguyen Lam Phuc

Reputation: 1431

Can you try with your project structure to be like this

home
    -project_root
    -docker-compose.yml
    -wsgi.py
    -Dockerfile
    -requirements.txt
    --app
    ---all other files

And your Dockerfile to be like this

FROM python:3.6.8-alpine3.9

WORKDIR /var/www/

ADD . /var/www/
RUN apk add --no-cache build-base libffi-dev openssl-dev ncurses-dev

RUN python -m pip install --upgrade pip
RUN pip install -r requirements.txt // gunicorn is install inside requirements.txt

EXPOSE 5000

CMD [ "gunicorn", "-w", "4", "--bind", "0.0.0.0:5000", "wsgi:app"]

Upvotes: 2

Wessel Klijnsma
Wessel Klijnsma

Reputation: 68

Should you point to wsgi.app? Does running this command resolve the issue?

CMD [ "gunicorn", "-w", "4", "--bind", "0.0.0.0:5000", "wsgi:app"]

Upvotes: 0

Related Questions