gpt4 book ai didi

python - Docker化Django App

转载 作者:行者123 更新时间:2023-11-29 07:30:32 24 4
gpt4 key购买 nike

我有一个使用 Python 2.7.10 和 Django 1.10.3 的 Django 应用程序。我的 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:
- 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_1 | django.db.utils.OperationalError: (2002, "Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock'

我查看并尝试了 Stackoverflow 上可用的解决方案,但没有成功。任何帮助将不胜感激。

最佳答案

Any help would be much appreciated.

关于 MySql 和 Django App 的关系,您有三种可能的情况:

  • MySql 与 Django 应用程序(本地主机)位于同一容器中
  • MySql 驻留在与 Django 应用程序不同的容器中(主机名不同,可以在不同的拓扑结构上处理——相同的子网或不同的等等)
  • MySql 位于 docker 生态系统之外(裸机、云,等等...)

从您的 settings.pydocker-compose.yml 来看,您正在混合使用前两种方法。现在,因为您可以从 settings.py 引用外部 MySql 服务器,我会认为这种情况很简单,接下来,将 MySql 塞进与 Django 应用程序相同的容器通常是个坏主意(如果您想扩展它们分开)所以这个答案将集中在第二种情况(MySql 在单独的容器中),并且为了简单起见,在同一个 docker-compose 文件上(你也可以将它们分开)。

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:

使用这样的 docker-compose 你将拥有以下 setting.py 配置(注意 HOST 正在获取 docker-compose service 条目的值对于数据库容器,端口在容器内部而不是在 docker-host 外部):

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'test_db',
'USER': 'test_user',
'PASSWORD': 'some_password',
'HOST': 'database',
'PORT': '3306',
}

作为旁注,我们通常使用来自 Django 应用程序文件的单独 docker-compose.yml 运行数据库,因为在通常的开发周期中,在 Django 应用程序容器上调整/重新启动/崩溃某些东西比在数据库一上更频繁,我们可以以这种方式单独处理它,加上这样一个单独定义的数据库可以处理几个不同的 DjangoApps,每个都有自己的容器。

关于python - Docker化Django App,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51484521/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com