我有一个django应用程序,它使用python2.7.10和django1.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/
my requirements.txt包含以下内容:
Django>=1.10,<2.0
Mysql-python
mydocker-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:
- localhost
settings.py包含数据库的以下内容:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'test',
'USER': 'test',
'PASSWORD': 'password',
'HOST': 'localhost',
'PORT': '3306',
}
我首先执行“%docker compose build”,然后执行“%docker compose up”,并得到以下错误:
web| django.db.utils.operationalerror:(2002,“无法通过socket连接到本地mysql服务器'/var/run/mysqld/mysqld.sock'
我查看并尝试了stackoverflow上可用的解决方案,但没有成功。任何帮助都将不胜感激。
1条答案
按热度按时间4xrmg8kj1#
任何帮助都将不胜感激。
关于mysql和django应用程序的关系,您有三种可能的情况:
mysql和django app(localhost)驻留在同一个容器中
mysql与django应用程序位于不同的容器中(主机名不同,可以在不同的拓扑上处理-相同的子网或不同的子网等)
mysql位于docker生态系统之外(裸机、云等等……)
从你的
settings.py
以及docker-compose.yml
你在混合前两种方法。现在,由于您可以从settings.py
我会认为这种情况微不足道,下一步,把mysql塞进django应用程序的同一个容器通常是个坏主意(如果你想单独扩展它们),所以这个答案将集中在第二种情况(mysql在单独的容器中),为简单起见,在同一个docker compose文件上(你也可以分开它们)。重要摘录自
docker-compose.yml
是:有了这样的 Docker ,你会有以下的人
setting.py
配置(注意HOST
是 Docker 的价值service
数据库容器的条目,端口是容器的内部端口,而不是docker主机的外部端口):作为旁注,我们通常使用单独的docker-compose.yml从django应用程序文件运行数据库,因为在通常的开发周期中,django应用程序容器上的调整/重新启动/崩溃要比数据库1上的频繁得多,我们可以这样单独处理,另外,这样一个单独定义的数据库可以处理几个不同的应用程序,每个应用程序都有自己的容器。