我读了很多关于这个的帖子,但仍然没有解决方案......
我有一个 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/