title: Django + uWSGI/nginx inside docker container - ImportError: No module named .wsgi
body: <p>This an ancient Django (v1.3.7) application that I'm migrating over to a Docker setup.
  The basic framework comes from <a href="https://github.com/dockerfiles/django-uwsgi-nginx" rel="nofollow noreferrer">this dockerfiles repo</a>.</p>
  
  <p>I can get the app running fine using Django's built in dev server (<code>./manage.py runserver</code>), but I'd like to have this served using uWSGI/Nginx in production.</p>
  
  <p>I can get uwsgi to run without errors when I call it from a bash prompt within the the container like so: <code>uwsgi --http :8000 --wsgi-file /home/docker/code/siteweb/glrimon.wsgi</code> However, when I try to import my wsgi file from the Django shell I get the same import error.</p>
  
  <p>Here is the what gets logged when I startup the container (which calls <code>/usr/local/bin/uwsgi --ini /home/docker/code/uwsgi.ini</code> via supervisord):</p>
  
  <pre><code>[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 ***
  </code></pre>
  
  <p>Here is my uwsgi.ini file:</p>
  
  <pre><code>[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
  </code></pre>
  
  <p>Here is what my wsgi file looks like:</p>
  
  <pre><code>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()
  </code></pre>
  
  <p>Dockerfile:</p>
  
  <pre><code>FROM ubuntu:16.04
  
  MAINTAINER Dockerfiles
  
  # Install required packages and remove the apt packages cache when done.
  
  RUN apt-get update &amp;&amp; \
      apt-get upgrade -y &amp;&amp; \
      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 &amp;&amp; \
      pip install -U pip setuptools &amp;&amp; \
      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 \
      &amp;&amp; ln -sf /dev/stderr /var/log/nginx/error.log \
      &amp;&amp; ln -sf /dev/stdout /var/log/uwsgi.log
  #    &amp;&amp; ln -sf /dev/stdout /var/log/uwsgi/req.log
  
  # setup all the configfiles
  RUN echo "daemon off;" &gt;&gt; /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"]
  </code></pre>
  
  <p>Any thoughts/ideas are always appreciated.</p>