2016-11-11 5 views
0

Я пытаюсь настроить django, используя докер, после этого tutorial, но он не справляется с пушкой, не находя мой основной модуль.Gunicorn не находит главный модуль с докерером

структура папок:

/project 
    .env 
    docker-compose.yml 
    /web 
    /static 
    manage.py 
    /django_project 
     /apps_directories... 
     /templates 
     __init__.py 
     settings.py 
     wsgi.py 

Веб раздел Докер-compose.yml

web: 
    restart: always 
    build: ./web 
    expose: 
    - "8000" 
    links: 
    - postgres:postgres 
    volumes: 
    - ./web:/usr/src/app 
    env_file: .env 
    command: /usr/local/bin/gunicorn django_project.wsgi:application -w 2 -b :8000 

Содержание "django_project/wsgi.py":

import os 
from django.core.wsgi import get_wsgi_application 

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "django_project.settings") 
application = get_wsgi_application() 

Ошибка брошенной при запуске контейнер:

[2016-11-01 16:39:48 +0000] [7] [INFO] Worker exiting (pid: 7) 
[2016-11-01 16:39:48 +0000] [1] [INFO] Shutting down: Master 
[2016-11-01 16:39:48 +0000] [1] [INFO] Reason: Worker failed to boot. 
[2016-11-01 16:39:49 +0000] [1] [INFO] Starting gunicorn 19.6.0 
[2016-11-01 16:39:49 +0000] [1] [INFO] Listening at: http://0.0.0.0:8000 (1) 
[2016-11-01 16:39:49 +0000] [1] [INFO] Using worker: sync 
[2016-11-01 16:39:49 +0000] [7] [INFO] Booting worker with pid: 7 
[2016-11-01 16:39:49 +0000] [7] [ERROR] Exception in worker process 
Traceback (most recent call last): 
    File "/usr/local/lib/python3.4/site-packages/gunicorn/arbiter.py", line 557, in spawn_worker 
    worker.init_process() 
    File "/usr/local/lib/python3.4/site-packages/gunicorn/workers/base.py", line 126, in init_process 
    self.load_wsgi() 
    File "/usr/local/lib/python3.4/site-packages/gunicorn/workers/base.py", line 136, in load_wsgi 
    self.wsgi = self.app.wsgi() 
    File "/usr/local/lib/python3.4/site-packages/gunicorn/app/base.py", line 67, in wsgi 
    self.callable = self.load() 
    File "/usr/local/lib/python3.4/site-packages/gunicorn/app/wsgiapp.py", line 65, in load 
    return self.load_wsgiapp() 
    File "/usr/local/lib/python3.4/site-packages/gunicorn/app/wsgiapp.py", line 52, in load_wsgiapp 
    return util.import_app(self.app_uri) 
    File "/usr/local/lib/python3.4/site-packages/gunicorn/util.py", line 357, in import_app 
    __import__(module) 
ImportError: No module named 'django_project' 

Почему он не находит модуль?

ответ

0

Это трудно быть 100% уверены, что не видя Dockerfile и полную установку, но я думаю, что проблема в этом разделе докер-compose.yml:

volumes: 
    - ./web:/usr/src/app 

В репо для учебника вы связаны к эквивалентному разделу:

volumes: 
    - /usr/src/app 
    - /usr/src/app/static 

Это происходит потому, что с помощью python:3.5-onbuild изображения вашего кода aleady был запеченным в к изображению, и поэтому не должно быть добавлена ​​в качестве тома.

Я предполагаю, что ваши рассуждения о том, что вы хотите добавить исходный код в качестве монтирования тома хоста, - это то, что внесенные вами изменения сразу отражаются в запущенном изображении для целей разработки. Если это так, то я думаю, что вы должны быть в состоянии добиться того, что путем изменения проблемного раздела к чему-то вроде:

volumes: 
    - .:/usr/src/app 

который даст вам это для всего веб-раздела:

web: 
    restart: always 
    build: ./web 
    expose: 
    - "8000" 
    links: 
    - postgres:postgres 
    volumes: 
    - .:/usr/src/app 
    env_file: .env 
    command: /usr/local/bin/gunicorn django_project.wsgi:application -w 2 -b :8000 

только проблема заключается в том, что процессы в контейнере выполняются с правами root, поэтому у вас могут возникнуть проблемы с разрешениями файлов любых файлов, которые создаются внутри контейнера. Если это станет проблемой, тогда будут документированы способы ее решения (что будет зависеть от того, что вам нужно достичь), или вы всегда можете задать другой вопрос здесь.