Как подключить контейнер 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'},
    }
}

и его работа!

Вернуться на верх