«Не могу подключиться к серверу MySQL на Django-Restframework с помощью MySQL в Docker» - PullRequest
0 голосов
/ 03 ноября 2018

Я докернизировал свой существующий проект Django Rest, который использует базу данных MySQL.

Dockefile

FROM python:3.6

ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
COPY . /code/
RUN pip install -r requirements.txt

needs.txt

Джанго
djongo
Джанго-отдых-основа
колесо
подушка
mysqlclient
django-cors-headers

docker-compose.yml

version: '3'
volumes:
    portainer:

services:
  db:
    image: mysql
    environment:
      MYSQL_ROOT_PASSWORD: docker
      MYSQL_DATABASE: docker
      MYSQL_USER: docker
      MYSQL_PASSWORD: docker
    ports:
      - "3306:3306"

  web:
    build: .
    command: bash -c "python manage.py makemigrations && python manage.py migrate && python manage.py runserver 0.0.0.0:8000 "
    volumes: 
      - .:/code
    ports:
      - "8000:8000"
    links:
     - db
  portainer:
   image: portainer/portainer
   ports:
   - "9000:9000"
   volumes:
    - /var/run/docker.sock:/var/run/docker.sock
    - portainer:/data

setting.py

        'ENGINE': 'django.db.backends.mysql', #django.db.backends.mysql 
        'NAME': 'docker', #local: libraries #server: 
        'USER': 'docker', #root #root
        'PASSWORD': 'docker', #local: root #server: 
        'HOST': 'db', #local: localhost  #server:
        'PORT': '3306',

Моя команда 'docker-compose up -d --build' выполнена успешно, но контейнер перезапуска не был запущен, поэтому при проверке журналов выявлялась эта ошибка django.db.utils.OperationalError: (2003, 'Can\'t connect to MySQL server on \'db\' (111 "Connection refused")').

1 Ответ

0 голосов
/ 03 ноября 2018

Это может произойти, если контейнер вашего приложения (web здесь) запускается до полной инициализации базы данных.

Необходимо дождаться запуска службы db (точнее, пока mysql не принимает подключения), прежде чем запускать приложение (python manage.py makemigrations && python manage.py migrate && python manage.py runserver 0.0.0.0:8000).

Для этого вы можете использовать сценарий wait-for-it.sh (проверьте https://docs.docker.com/compose/startup-order/) перед запуском ваших команд python. В качестве альтернативы вы можете использовать политику перезапуска для вашей службы web (https://docs.docker.com/compose/compose-file/#restart_policy) для автоматического перезапустите службу (пока база данных не будет запущена).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...