Docker - Django设置 - Gunicorn确定但不管理.py

时间:2018-01-08 11:50:06

标签: django docker docker-compose gunicorn manage.py

我读了很多关于此的帖子,但仍然没有解决方案......

我有一个docker-compose项目,其中包括我构建的django服务。

在我的生产环境中,它正在使用gunicorn + nginx。一切都很好,按预期工作。

但是在我的开发环境中,我只使用manage.py runserver。这里的麻烦就开始了。不知何故,manage.py使用我之后删除的settings.py的旧版本。在我的特定情况下,runserver正在寻找一个本地的mysql db,它不存在,因为它位于另一个容器中。

所以,它与gunicorn和manage.py之间的settings.py相同,为什么它在一个而不是另一个中工作?

我的项目结构:

mysite
|_ django_mysite/
|   |_ __init__.py
|   |_ settings.py
|   |_ urls.py
|   |_ wsgi.py
|_ myapp/
|   |...
|_ static/
|   |...
|_ manage.py
|_ uwsgi_params

我的manage.py:

#!/usr/bin/env python
import os
import sys

if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "django_mysite.settings")
    try:
        from django.core.management import execute_from_command_line
    except ImportError:
        # The above import may fail for some other reason. Ensure that the
        # issue is really that Django is missing to avoid masking other
        # exceptions on Python 2.
        try:
            import django
        except ImportError:
            raise ImportError(
                "Couldn't import Django. Are you sure it's installed and "
                "available on your PYTHONPATH environment variable? Did you "
                "forget to activate a virtual environment?"
            )
        raise
    execute_from_command_line(sys.argv)

我的wsgi.py:

"""
WSGI config for django_mysite project.

It exposes the WSGI callable as a module-level variable named ``application``.

For more information on this file, see
https://docs.djangoproject.com/en/1.11/howto/deployment/wsgi/
"""

import os
import sys

from django.core.wsgi import get_wsgi_application


BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(BASE_DIR)

os.environ['DJANGO_SETTINGS_MODULE'] = 'django_mysite.settings'
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "django_mysite.settings")

application = get_wsgi_application()

我的Dockerfile(如果有用):

FROM alpine:3.7
MAINTAINER XXX XXX

# Dependencies
RUN rm -rf /var/cache/apk/* \
  && rm -rf /tmp/* \
  && apk update \
  && apk --no-cache add python py-pip build-base gettext libxslt-dev jpeg-dev \
  && mkdir -p /data/web

WORKDIR /data/web

# Django mysite requirements
COPY settings /data/web/
RUN apk --no-cache add python-dev mysql-client mysql-dev \
  && pip install --no-cache-dir -r requirements.txt
  && apk del -r python-dev mysql

# Pull mysite code
# Change settings.py and requirements.txt
RUN apk --no-cache add git \
  && git clone -b xx_xxxx https://github.com/XXX/xxx \
  && apk del -r git \
  && rm /data/web/mysite/requirements.txt \
  && rm /data/web/mysite/django_mysite/settings.py \
  && mv requirements.txt mysite/requirements.txt \
  && mv settings.py mysite/django_mysite/settings.tmp.py \
  && mv settings.build.py mysite/django_mysite/settings.py \

# Collect static django files and replace right settings.py file
WORKDIR /data/web/mysite
RUN python /data/web/mysite/manage.py collectstatic --no-input \
  && rm django_mysite/settings.py \
  && mv django_mysite/settings.tmp.py django_ mysite/settings.py

如果我进入django容器并运行“manage.py diffsettings”,我只会看到我在构建中用于collectstatic的旧设置。

但是,如果我直接从容器中检查settings.py文件,我会看到正确的settings.py。

在开发环境中,我的compose通过以下命令启动runserver:

/usr/bin/python manage.py runserver 0.0.0.0:8000

并出现以下问题:

'Can\'t connect to local MySQL server through socket \'/run/mysqld/mysqld.sock\' (2 "No such file or directory")'

(有道理.django容器没有mysql,它是主机中引用的mysql容器)

在我的产品上:

/usr/bin/gunicorn django_mysite.wsgi:application -w 2 -b :8000

一切都很完美。来自django容器的Gunicorn处理msql容器和nginx容器。

有什么想法吗?它可能与Docker层有关吗?

谢谢!

E

1 个答案:

答案 0 :(得分:0)

无法告诉您共享的文件,但这似乎是docker中应用程序的一个反复出现的问题。您可以尝试以下选项:

1)您是否有不同的文件来设置prod和dev数据库?检查开发人员数据库是否有"主机名"选项。如果它没有,95%确定它将指向localhost(因此会在开发机器上给你带来麻烦)。

2)你有dev机器的数据库容器吗?尝试从应用程序容器连接到mysql客户端到数据库容器。您可以使用docker exec -it container_id /bin/bash(您必须适应,因为它是阿尔卑斯山)才能附加到应用容器。

3)数据库容器是否正在运行,但您无法连接到它?检查容器门是否打开以便到达数据库。