Задать вопрос
Sergei_Erjemin
@Sergei_Erjemin
Улыбайся, будь самураем...

Как на MacOS правильно подключить Django к БД в Docker?

Приучаю себя к хорошему, заставляю себя перейти с Windows на macOS. Под окошками схема отработана, там надо всего-навсего поставить специально скомпилированный коннектор к БД (например, отсюда) и все работает. Но под macOS, хоть и прилетают коннекторы через PIP, выдаётся ошибка:
django.db.utils.OperationalError: (2002, "Can't connect to server on '192.168.1.ххх' (60)")
...

Схема такая:

Docker Compose

Есть вот такой docker-compose.yml:
version: "3.0"
services:
  mariadb:
    container_name: MariaDB
    image: mariadb:10.7.6
    volumes:
      - "/Users/xxx/VM/docker-data/mariadb/data:/var/lib/mysql"
    environment:
      - "MYSQL_ROOT_PASSWORD=*****"
      - "MYSQL_ROOT_HOST=192.168.1.xxx"
    ports:
      - "3307:3306"
    command:
      --bind-address="0.0.0.0"
      --skip_ssl="true"
      --character-set-server="utf8"
      --collation-server="utf8_unicode_ci"

В docker через CLI создан внешний суперпользователь, база, пользователь базы, выданы права этому пользователю. Контейнер запущен. Через DataGrip к этой базе отлично коннектится, таблицы видны и все ок. С других машин в домашней сетки тоже коннектится (ведь база "светит" на внешний адрес по порту 3307).

Установка коннектора на macOS

Само собой по PIP просто так коннектор не поставится. Нужно чтобы в системе был клиент БД. Не знаю, правильно ли делаю, но нагуглилось такое:
# устанавливаю коннектор
brew install mariadb-connector-c

# симлинк конфиг-файла, в каталог, где его будет искать python-коннектор 
sudo ln -s /usr/local/opt/mariadb-connector-c/bin/mariadb_config /usr/local/bin/mysql_config

# активируем виртуальное окружение, ставим коннектор
source ~/path-to-project-enveroment/bin/activate
pip install mysqlclient

# выключаем окружение, удаляем симлинк и отключаем системный коннектор (можно этого и не делать)
deactivate
sudo rm /usr/local/bin/mysql_config
brew unlink mariadb-connector-c

Python-коннектор базы данных стоит и даже притащил зависимость:
mysql-connector-python==8.0.31
mysqlclient==2.1.1

Под окошками, когда коннектор стоит, уже все работает. Но не под macOS. Само собой проверил-перепроверил настройки БД в Django (собственно по ошибке видно, что пытается коннектится по верному IP БД):
import socket
from prj.my_secret import MY_DATABASE_HOST_DEV1, MY_DATABASE_HOST_DEV2, MY_DATABASE_PORT_DEV, MY_DATABASE_NAME_DEV, MY_DATABASE_USER_DEV, MY_DATABASE_PASSWORD_DEV, MY_HOST_HOME1

DATABASES = {
        'default': {
        'ENGINE': "django.db.backends.mysql",
        'HOST': MY_DATABASE_HOST_DEV1 if socket.gethostname() == MY_HOST_HOME1 else MY_DATABASE_HOST_DEV2,
        'PORT': MY_DATABASE_PORT_DEV,  
        'NAME': MY_DATABASE_NAME_DEV,  
        'USER': MY_DATABASE_USER_DEV,  
        'PASSWORD': MY_DATABASE_PASSWORD_DEV,  
        # 'OPTIONS': { 'autocommit': True, }
    }
}


Что делать? Почему?? Что за грабли с macOS?

P.S. macOS Monterey 12.6, процессор M1 (UPD: macOS Ventura 13.0,).
  • Вопрос задан
  • 180 просмотров
Подписаться 1 Простой 4 комментария
Ответ пользователя Drno К ответам на вопрос (3)
@Drno
Лично мое мнение.
Такие вещи проще всего ставить в среде, для которых они создавались.
Ставим виртуалку с Ubuntu, ставим внутрь всё что надо
Ответ написан