2017-05-09 1 views
1

Docker 설정으로 이전하는 고대 Django (v1.3.7) 응용 프로그램입니다. 기본 프레임 워크는 this dockerfiles repo에서 제공됩니다.Dockanger 컨테이너 안에 Django + uWSGI/nginx - ImportError : 모듈이 없습니다 .wsgi

장고의 내장 된 개발 서버 (./manage.py runserver)를 사용하여 앱을 잘 실행할 수 있지만이 프로덕션 환경에서는 uWSGI/Nginx를 사용하고 싶습니다.

컨테이너 내에서 bash 프롬프트에서 호출 할 때 uwsgi를 오류없이 실행할 수 있습니다. uwsgi --http :8000 --wsgi-file /home/docker/code/siteweb/glrimon.wsgi 그러나 장고 쉘에서 wsgi 파일을 가져 오려고하면 동일한 가져 오기 오류가 발생합니다. 여기

[uWSGI] getting INI configuration from /home/docker/code/uwsgi.ini 
*** Starting uWSGI 2.0.15 (64bit) on [Tue May 9 13:35:14 2017] *** 
compiled with version: 5.4.0 20160609 on 05 May 2017 18:06:55 
os: Linux-3.16.0-77-generiC#99~14.04.1-Ubuntu SMP Tue Jun 28 19:17:10 UTC 2016 
nodename: 222b58f8d3ea 
machine: x86_64 
clock source: unix 
detected number of CPU cores: 8 
current working directory:/
detected binary path: /usr/local/bin/uwsgi 
!!! no internal routing support, rebuild with pcre support !!! 
uWSGI running as root, you can use --uid/--gid/--chroot options 
*** WARNING: you are running uWSGI as root !!! (use the --uid flag) *** 
chdir() to /home/docker/code/siteweb/ 
your memory page size is 4096 bytes 
detected max file descriptor number: 524288 
lock engine: pthread robust mutexes 
thunder lock: disabled (you can enable it with --thunder-lock) 
uwsgi socket 0 bound to UNIX address /home/docker/code/app.sock fd 3 
Python version: 2.7.12 (default, Nov 19 2016, 06:48:10) [GCC 5.4.0 20160609] 
2017/05/09 13:35:14 [debug] 11#11: epoll add event: fd:6 op:1 ev:00002001 
2017/05/09 13:35:14 [debug] 12#12: epoll add event: fd:6 op:1 ev:00002001 
2017/05/09 13:35:14 [debug] 11#11: epoll del event: fd:6 op:2 ev:00000000 
Python main interpreter initialized at 0x8f11c0 
python threads support enabled 
your server socket listen backlog is limited to 100 connections 
your mercy for graceful operations on workers is 60 seconds 
mapped 415360 bytes (405 KB) for 8 cores 
*** Operational MODE: preforking+threaded *** 
added /usr/local/lib/python2.7/dist-packages/ to pythonpath. 
added /usr/lib/python2.7/ to pythonpath. 
added ./siteweb to pythonpath. 
ImportError: No module named glrimon.wsgi 
unable to load app 0 (mountpoint='') (callable not found or import error) 
*** no app loaded. going in full dynamic mode *** 
*** uWSGI is running in multiple interpreter mode *** 

내 uwsgi.ini 파일입니다 :

여기
[uwsgi] 
# this config will be loaded if nothing specific is specified 
# load base config from below 
ini = :base 

# %d is the dir this configuration file is in 
socket = %dapp.sock 
master = true 
processes = 4 
threads = 2 

#logging 
logto=/var/log/uwsgi.log 

[dev] 
ini = :base 
# socket (uwsgi) is not the same as http, nor http-socket 
socket = :8001 


[local] 
ini = :base 
http = :8000 


[base] 
# chdir to the folder of this config file, plus app/website 
chdir = %dsiteweb/ 
# allow anyone to connect to the socket. This is very permissive 
chmod-socket=666 
# explicitly set python path 
pythonpath = /usr/local/lib/python2.7/dist-packages 
pythonpath = /usr/lib/python2.7 
pythonpath = ./siteweb 
# also referencing here: http://uwsgi-docs.readthedocs.io/en/latest/WSGIquickstart.html#deploying-django 
env = DJANGO_SETTINGS_MODULE=siteweb.settings 
# load the module from wsgi.py, it is a python path from 
# the directory above. 
module=glrimon.wsgi:application 

무엇 내 WSGI는 여기

내가 (supervisord를 통해 /usr/local/bin/uwsgi --ini /home/docker/code/uwsgi.ini를 호출) 컨테이너를 시동 할 때 로그인 가져옵니다 무엇인가

import sys 
import os 

sys.path.append(os.path.dirname(os.path.dirname(__file__))) 
sys.path.append(os.path.dirname(__file__)) 

os.environ['DJANGO_SETTINGS_MODULE'] = 'settings' 

import django.core.handlers.wsgi 
application = django.core.handlers.wsgi.WSGIHandler() 

Dockerfile : 파일처럼 보이는

FROM ubuntu:16.04 

MAINTAINER Dockerfiles 

# Install required packages and remove the apt packages cache when done. 

RUN apt-get update && \ 
    apt-get upgrade -y && \ 
    apt-get install -y \ 
    git \ 
    # for python package lxml 
    libxml2-dev libxslt1-dev zlib1g-dev \ 
    # for python package PIL 
    libtiff5-dev libjpeg8-dev \ 
    # for python package psycopg2 
    build-essential libpq-dev \ 
    # for geodjango 
    libgeos-dev \ 
    python \ 
    python-dev \ 
    python-setuptools \ 
    python-pip \ 
    nginx \ 
    supervisor \ 
    sqlite3 && \ 
    pip install -U pip setuptools && \ 
    rm -rf /var/lib/apt/lists/* 

# install uwsgi now because it takes a little while 
RUN pip install uwsgi 

# setup uwsgi logging directory 
RUN mkdir -p /var/log/uwsgi 

# forward request and error logs to docker log collector 
RUN ln -sf /dev/stdout /var/log/nginx/access.log \ 
    && ln -sf /dev/stderr /var/log/nginx/error.log \ 
    && ln -sf /dev/stdout /var/log/uwsgi.log 
# && ln -sf /dev/stdout /var/log/uwsgi/req.log 

# setup all the configfiles 
RUN echo "daemon off;" >> /etc/nginx/nginx.conf 
COPY nginx-app.conf /etc/nginx/sites-available/default 
COPY supervisor-app.conf /etc/supervisor/conf.d/ 

# COPY requirements.txt and RUN pip install BEFORE adding the rest of your code, this will cause Docker's caching mechanism 
# to prevent re-installinig (all your) dependencies when you made a change a line or two in your app. 

COPY requirements.txt /home/docker/code/ 
RUN pip install -r /home/docker/code/requirements.txt 
# workaround for missing distribution for pkg_resources 
# ref: http://stackoverflow.com/questions/7446187/no-module-named-pkg-resources 
#RUN pip install --upgrade setuptools 

# deal with Geodjango GEOSexception error 
# (ref: http://stackoverflow.com/a/19811665/6072959) 
RUN sed -i 's/d+)\$/d+)\.\*\$/g' \ 
    /usr/local/lib/python2.7/dist-packages/django/contrib/gis/geos/libgeos.py 

# add (the rest of) our code 
# skip this step since the code is actually referenced via 
# symlink since it's gigantic 
# connect a volume to the code during docker run instead 
COPY . /home/docker/code/ 

WORKDIR /home/docker/code 

# install django, normally you would remove this step because your project would already 
# be installed in the code/siteweb/ directory 
#RUN django-admin.py startproject website /home/docker/code/siteweb/ 

EXPOSE 80 
CMD ["supervisord", "-n"] 

모든 의견/아이디어는 언제나 감사하겠습니다.

+0

그것은 chdir 때문에 생긴 것 같습니다. 이 부분'chdir = % dsiteweb /'은'chdir =/home/docker/code/siteweb /'로 바꿀 수 있습니까? – Robert

+0

시도해 볼게요.하지만 로그 파일에이 라인 ('chdir()/home/docker/code/siteweb /')이 있습니다. 그러면 설정이 제대로 작동한다고 믿게 될 것입니다. – rumski20

+0

이전과 같은 결과. 제안 주셔서 감사합니다. – rumski20

답변

0

두 가지 아이디어.

  1. 나는 pythonpath = ./siteweb 초기 현재 작업 디렉토리를 기준으로 궁금해? 수동으로 실행하면 /home/docker/code에 이미 있습니까? 하여 Dockerfile에 다음을 추가하십시오 :

    WORKDIR /home/docker/code 
    
  2. 는 INI 파일에 대한 올바른 옵션을 모듈인가? uwsgi-docs.readthedocs.io/en/latest/WSGIquickstart.html에 따르면 명령 줄에서 --wsgi-file /home/docker/code/siteweb/glrimon.wsgi를 사용하고 있다면 wsgi-file도 있어야합니다. /iome/docker/code/siteweb/glrimon.wsgi ini 파일에 있습니다. 그들의 예제는`module = django.core.handlers.wsgi : WSGIHandler()도있다. 그러나 wsgi 파일을로드하고 있기 때문에 아마 필요하지 않을 것입니다 (아마 하나 또는 다른 것입니다).

+0

이것은 작동하지 않는 것 같습니다. 시작시 동일한 ImportError를 얻었고 사이트에 액세스하려고하면 파이썬 응용 프로그램을 찾을 수 없습니다. 시작 로그에서 오류를 확인하십시오 --- 원래 문서에 도커 파일을 추가하겠습니다. – rumski20

+0

'module'은 ini 파일에 대한 올바른 옵션입니까? http://uwsgi-docs.readthedocs.io/en/latest/WSGIquickstart.html에 따르면 명령 줄에서'--wsgi-file/home/docker/code/siteweb/glrimon.wsgi'을 사용한다면 아마도 ini 파일에'wsgi-file/home/docker/code/siteweb/glrimon.wsgi'도있을 것입니다. 그들의 예제는''module = django.core.handlers.wsgi : WSGIHandler()'도 가지고있다. 그러나 wsgi 파일을로드하고 있기 때문에 아마 필요하지 않을 것입니다 (아마 하나 또는 다른 것입니다). –

+0

이 제안은 도움이되었거나 적어도 다른 오류를 생성했습니다 (https://docs.docker.com/compose/startup-order/에서 설명한 문제와 유사). 나는 그 문제를 해결했지만 지금은 장고에 문제가있는 것으로 보인다. 필자가 설명한 초기 오류가 완화 된 것으로 보였으므로이를 올바르게 표시 할 것입니다. 도와 주셔서 감사합니다. – rumski20

관련 문제