我读了很多关于此的帖子,但仍然没有解决方案......
我有一个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
答案 0 :(得分:0)
无法告诉您共享的文件,但这似乎是docker中应用程序的一个反复出现的问题。您可以尝试以下选项:
1)您是否有不同的文件来设置prod和dev数据库?检查开发人员数据库是否有"主机名"选项。如果它没有,95%确定它将指向localhost(因此会在开发机器上给你带来麻烦)。
2)你有dev机器的数据库容器吗?尝试从应用程序容器连接到mysql客户端到数据库容器。您可以使用docker exec -it container_id /bin/bash
(您必须适应,因为它是阿尔卑斯山)才能附加到应用容器。
3)数据库容器是否正在运行,但您无法连接到它?检查容器门是否打开以便到达数据库。