我有一个Django应用程序,它使用Python2.7.10和Django 1.10.3。我的Dockerfile包含以下内容:
FROM python:2.7.10
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
ADD requirements.txt /code/
RUN pip install -r requirements.txt
ADD . /code/ 我的requirements.txt包含以下内容:
Django>=1.10,<2.0
Mysql-python我的docker-compose.yml包含以下内容:
version: '2'
services:
localhost:
image: mysql
restart: always
environment:
MYSQL_DATABASE: 'test'
MYSQL_USER: 'test'
MYSQL_PASSWORD: 'password'
web:
build: .
command: python manage.py runserver 0.0.0.0:8000
volumes:
- .:/code
ports:
- "8000:8000"
depends_on:
- localhostsettings.py包含数据库的以下内容:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'test',
'USER': 'test',
'PASSWORD': 'password',
'HOST': 'localhost',
'PORT': '3306',
}我首先执行"% docker-组合构建“,然后执行"% docker-组合”,并得到以下错误:
web_1 / django.db.utils.OperationalError:(2002年,“无法通过socket‘/var/run/mysqld/mysqld.sock”连接到本地MySQL服务器)
我在没有运气的情况下查看并尝试了Stackoverflow上可用的解决方案。任何帮助都将不胜感激。
发布于 2018-07-23 21:29:18
任何帮助都将不胜感激。
关于MySql和Django应用程序关系,有三种可能的情况:
从您的settings.py和docker-compose.yml判断,您正在混合前两种方法。现在,由于您可以从MySql中引用外部settings.py服务器,所以我将考虑这种情况,接下来,将MySql塞在与Django应用程序相同的容器上通常是个坏主意(如果您想单独扩展它们的话),所以这个答案将集中在第二种情况(在单独的容器中的MySql)上,并且为了简单起见,将它们放在同一个坞-组合文件上(您也可以将它们分开)。
docker-compose.yml的重要摘录如下:
version: '2'
services:
# The Database
database:
image: mysql:5.6
volumes:
- dbdata:/var/lib/mysql
environment:
- "MYSQL_DATABASE=test_db"
- "MYSQL_USER=test_user"
- "MYSQL_PASSWORD=some_password"
- "MYSQL_ROOT_PASSWORD=some_root_password"
ports:
- "33061:3306"
container_name: "mysql_database"
# Django App (taken from your example, added env vars as hint)
web:
build: .
command: python manage.py runserver 0.0.0.0:8000
environment:
- "DB_PORT=3306"
- "DB_HOST=database"
volumes:
- .:/code
ports:
- "8000:8000"
depends_on:
- database
volumes:
dbdata:通过这样的setting.py配置,您将拥有如下的HOST配置(注意,对于数据库容器,端口是容器的内部值,而不是停靠主机外部的端口):
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'test_db',
'USER': 'test_user',
'PASSWORD': 'some_password',
'HOST': 'database',
'PORT': '3306',
}作为一个sidenote,我们通常在Django应用程序文件中使用单独的docker-compose.yml运行数据库,因为在通常的开发周期中,在Django App容器上调整/重新启动/崩溃某些东西要比在数据库容器上频繁得多,而且我们可以用这种方式分别处理它,另外,这样一个单独定义的数据库可以处理几个不同的DjangoApps,每个数据库都有自己的容器。
https://stackoverflow.com/questions/51484521
复制相似问题