django.db.utils.OperationalError: (2005, "Неизвестный сервер MySQL 'db' (-2)") - PullRequest
0 голосов
/ 26 августа 2018

Я пытаюсь запустить django с mysql в контейнерах Docker:

version: '2'
services:

  db:
    image: mysql:latest
    volumes:
      - ./db:/var/lib/mysql
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: mypassword
      MYSQL_USER: root
      MYSQL_PASSWORD: mypassword
      MYSQL_DATABASE: django
    expose:
      - "3306"

  web:
    build: .
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    depends_on:
     - db

но после docker-compose up --build я получил ошибку:

django.db.utils.OperationalError: (2005, "Неизвестный хост сервера MySQL 'db' (-2) ")

Скорее всего, контейнер с mysql не успел запуститься. Но я указал depends_on: - db в web

Кто понимает, в чем может быть дело?

Ответы [ 3 ]

0 голосов
/ 26 августа 2018

depends_on в docker-compose означает, что сервис зависит от другого и не может работать без него, но это не означает, что другой сервис готов и ожидает запросы.

Что мне нравитсясделать, это добавить wait-for-it в моей команде к контейнеру, который нуждается в другом сервисе, чтобы быть готовым к обработке запроса.

В вашем случае с db и web, после добавления wait-for-it.sh в мой каталог программ, я бы изменил команду для веб-контейнера так:

./wait-for-it.sh -t 300 db:3306 && python manage.py runserver 0.0.0.0:8000

Это просто скажет web ждать доступности хоста db на порту 3306, синхронизируя таким образом ускорение двух взаимозависимых служб

0 голосов
/ 26 августа 2018

Если я не ошибаюсь, вы должны использовать links в вашем docker-compose, как

version: '2'
services:

  db:
    image: mysql:latest
    volumes:
      - ./db:/var/lib/mysql
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: mypassword
      MYSQL_USER: root
      MYSQL_PASSWORD: mypassword
      MYSQL_DATABASE: django
    expose:
      - "3306"

  web:
    build: .
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    depends_on:
     - db
    <b>links:
      - db</b>
0 голосов
/ 26 августа 2018

Согласно официальной документации docker-compose , depends_on означает, что этот сервис зависит от другого и не может работать без него, но это не означает, что другой сервис готов обрабатывать запросы.

Итак, когда вы запускаете развертывание, docker-compose гарантирует, что при запуске службы web, db также работает (если вы попытаетесь уничтожить контейнер db, вы заметите,в докере составьте логи, которые web тоже будут убиты).Поскольку образу MySQL требуется время для начальной загрузки, это приводит к тому, что база данных не может мгновенно обрабатывать запросы.

Для решения этой проблемы в docker-compose есть ключевое слово restart, которое указываетповедение вашего контейнера, когда что-то идет не так и ваш процесс умирает (например, если у вас нет db готового к обработке запросов).

В заключение ваш файл docker-compose.yaml должен иметь следующий вид:

version: '2'
services:

  db:
    image: mysql:latest
    volumes:
      - ./db:/var/lib/mysql
    restart: always
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: mypassword
      MYSQL_USER: root
      MYSQL_PASSWORD: mypassword
      MYSQL_DATABASE: django
    expose:
      - "3306"

  web:
    build: .
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    restart: always
    ports:
      - "8000:8000"
    depends_on:
     - db

Подробнее о ключевом слове restart можно узнать в официальной документации

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