2017-05-09 53 views
1

這是一個我正在遷移到Docker設置的古老Django(v1.3.7)應用程序。 基本框架來自this dockerfiles repoDocker容器中的Django + uWSGI/nginx - ImportError:沒有名爲.wsgi的模塊

我可以使用Django內置的開發服務器(./manage.py runserver)使應用程序正常運行,但我希望在生產中使用uWSGI/Nginx。

當我從容器內的bash提示中調用它時,我可以使uwsgi運行時沒有錯誤,如下所示:uwsgi --http :8000 --wsgi-file /home/docker/code/siteweb/glrimon.wsgi但是,當我嘗試從Django shell導入我的wsgi文件時,我得到了相同的導入錯誤。

下面是當我啓動容器(它通過調用supervisord /usr/local/bin/uwsgi --ini /home/docker/code/uwsgi.ini)中記錄的內容:

[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文件看起來像:

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()to/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 ini文件中的/home/docker/code/siteweb/glrimon.wsgi。他們的例子也有`module = django.core.handlers.wsgi:WSGIHandler()。但是由於你正在加載一個wsgi文件,這可能不需要(它可能是一個或另一個)。

+0

這似乎也沒有工作。我在啓動時得到相同的ImportError,當我嘗試訪問網站時,我看到'---沒有找到python應用程序,請檢查你的啓動日誌是否有錯誤---'我會將我的dockerfile添加到原始問題中。 – 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/)。我已經解決了這個問題,但是現在Django似乎存在一個問題。我會將其標記爲正確的,因爲它似乎減輕了我描述的初始錯誤。謝謝您的幫助。 – rumski20

相關問題