Как подключить контейнер django к контейнеру mysql
Здравствуйте, я хочу подключить django - mysql в каждом контейнере :)
Я пробовал много способов, но безуспешно.
вот мой msql docker-compose.yaml
version: "3"
services:
db:
platform: linux/x86_64
image: mysql:5.7
container_name: good-mysql
ports:
- "3307:3306"
environment:
- MYSQL_ROOT_PASSWORD=test
- MYSQL_DATABASE=testdb
command:
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_unicode_ci
volumes:
- /Users/Shared/data/mysql-test:/var/lib/mysql
network_mode: bridge
я использовал официальный образ mysql
и мой django Dockerfile
FROM ubuntu:18.04
FROM python:3.8.6-buster
ENV PYTHONUNBUFFERED 1
# General Packages
RUN apt-get update \
&& apt-get install -y libmariadb-dev \
&& apt-get install -y python3-pip \
&& apt-get install -y build-essential \
&& apt-get install -y libcurl4-openssl-dev \
&& apt-get install -y libssl-dev \
&& pip install --upgrade pip
RUN mkdir -p /project/myproject
COPY ./myproject /project/myproject
RUN mkdir -p /app
WORKDIR /app
RUN pip install -r requirements.txt
CMD tail -f /dev/null
и docker-compose.yaml
version: '3.8'
services:
deepnatural-ai-api:
build: .
image: deepnatural-ai-api:latest
container_name: deepnatural-ai-api
ports:
- 1000:1000
external_links:
- "good-mysql:db"
network_mode: bridge
и я запускаю docker-compose up -d
каждый контейнер
и получить доступ к контейнеру mysql, запустить mysql -uroot -p
его работу!
но когда я обращаюсь к контейнеру django для запуска миграций, он выдает ошибку
"Unknown MySQL server host 'db' (-2)")
мой django settings.py имеет вид
ALLOWED_HOSTS = ['*']
INSTALLED_APPS = [
'...',
]
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'testdb',
'USER': 'root',
'PASSWORD': 'test',
'HOST': 'db',
'PORT': '3306',
'OPTIONS': {'auth_plugin': 'mysql_native_password'},
}
}
ROOT_URLCONF = 'myproject.urls'
DEFAULT_AUTO_FIELD='django.db.models.AutoField'
STATIC_URL = '/static/'
INTERNAL_IPS = [
'127.0.0.1',
'0.0.0.0',
]
я дважды проверил сеть docker, имя хоста db, пароль, имя db и т.д...
но django не может найти хост db "good-mysql"
помогите советом спасибо :)
pip install dj-database-url
settings.py
import dj_database_url
DATABASES = {"default": dj_database_url.config()}
и в конфиге вашего контейнера django вам нужно добавить:
environment:
- DATABASE_URL=mysql://<username>:<password>@<db_container_name>/<db_name>
Попробуйте объединить ваши файлы docker-compose:
version: '3.8'
services:
deepnatural-ai-api:
build: .
image: deepnatural-ai-api:latest
container_name: deepnatural-ai-api
ports:
- 1000:1000
depends_on:
- db
db:
platform: linux/x86_64
image: mysql:5.7
ports:
- "3307:3306"
environment:
- MYSQL_ROOT_PASSWORD=test
- MYSQL_DATABASE=testdb
command:
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_unicode_ci
volumes:
- mysql_test:/var/lib/mysql/data
volumes:
mysql_test:
Попробуйте запустить docker-compose up -d --build
сейчас. Оба контейнера должны запуститься, причем контейнер db
запустится первым, поскольку deepnatural-ai-api
имеет его в качестве зависимости.
Если вы не хотите объединять файлы docker-compose. Пожалуйста, перечислите запущенные контейнеры после того, как вы запустите их оба с помощью docker container ls
.
я решил свою проблему
я использовал IPv4Address
контейнер mysql типа 172.17.0.3
я выполнил команду docker network inspect bridge
и проверил IPv4Address
и вставьте мой settings.py следующим образом
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'testdb',
'USER': 'root',
'PASSWORD': 'test',
'HOST': '172.17.0.3', # <---- mysql container IPv4Address
'PORT': '3306',
'OPTIONS': {'auth_plugin': 'mysql_native_password'},
}
}
и его работа!