django - Docker - Django 设置 - Gunicorn ok 但不是 manage.py

标签 django docker docker-compose gunicorn manage.py

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

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

在我的 prod 环境中,它使用 gunicorn + nginx。一切正常,按预期工作。

但是在我的开发环境中,我只使用 manage.py runserver。麻烦就从这里开始。不知何故,manage.py 使用了我的 settings.py 的旧版本,此后该版本已被删除。在我的具体情况下,runserver 正在寻找一个不存在的本地 mysql 数据库,因为它在另一个容器中。

那么,gunicorn 和 manage.py 之间的 settings.py 是相同的,为什么它在一个中起作用而不在另一个中起作用???

我的项目结构:

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

我的管理.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 通过以下命令启动运行服务器:
/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层有关吗?

谢谢!

最佳答案

无法从您共享的文件中分辨出来,但这似乎是 docker 中的应用程序经常出现的问题。以下是您可以尝试的一些选项:

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

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

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

关于django - Docker - Django 设置 - Gunicorn ok 但不是 manage.py,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48149721/

相关文章:

插入中的 Django 子查询

python - django 信号是否也包含在 transaction.atomic 装饰器中?

jenkins - 在 jenkins 中使用 docker-build-step 插件构建 dockerfile 时 ADD 命令失败

docker - 如何在 Gitlab CI 中使用 Dockerfile

docker - 如果过程停止,是否有办法让容器退回控制台?

django - Django动态表单-实时字段填充?

linux - Docker 组成卷权限 linux

spring - 调用 docker-compose build 命令时执行 Spring buildpacks

超出 Docker 内存限制

python - 无法解决 Django 设置中的 mod_wsgi 异常