невозможно получить доступ к базе данных mysql через python (оба работают в разных контейнерах) - PullRequest
0 голосов
/ 23 мая 2019

Я пытаюсь подключиться к базе данных mysql с помощью программы на python. При локальном запуске это работает.

Но при докеризации созданного мною приложения один контейнер предназначен для кода Python, а другой - для базы данных mysql. При запуске таким способом он не может подключиться.

Python_code:

db.bind(provider='mysql', user='docker_root', password='password', host='db', database=database, port = 3306)

докер-Compose:

version: "3"
  services:
    app:
      image: app:latest
      links:
        - db
      ports:
        - "8001:8081"
      environment:
        - DB_HOST= db

    db:
      image: mysql:5.7.26
      restart: always
      environment:
        MYSQL_DATABASE: 'my_db'
        MYSQL_USER: 'docker_root'
        MYSQL_PASSWORD: 'password'
        MYSQL_ROOT_PASSWORD: 'password'
      ports:
        - "3306:3306"
      volumes:
        - ./DB_config/:/etc/mysql/mysql.conf.d

И в docker-compose с ошибкой не получается:

pony.orm.dbapiprovider.OperationalError: (2003, «Не удается подключиться к Сервер MySQL на 'db' ([Errno 111] Соединение отказано) ")

Куда я иду не так? Пожалуйста, сообщите!

Ответы [ 3 ]

1 голос
/ 23 мая 2019

Вы можете использовать флаг зависимости от имени, указанный в принятом ответе. Если это не решит вашу проблему, они используют этот подход.

После запуска контейнера ваш сервер попытается подключиться к серверу базы данных. иногда серверу базы данных может потребоваться некоторое время для загрузки, и в этом окне, если сервер попытается подключиться к серверу базы данных, он столкнется с проблемами. Попробуйте добавить логику для повторного подключения к серверу базы данных через несколько секунд в случае сбоя подключения.

try{
   connectToDatabase();
   }catch(error){
   waitForHalfMinute();
   connectToDatabase();
}
1 голос
/ 23 мая 2019

Я бы порекомендовал вам выйти из приложения в случае, если оно не может подключиться к MySQL, и всегда устанавливать политику перезапуска, поскольку depends_on не гарантирует, что MySQL будет полностью запущен при запуске app, но хорошо иметь это там.

version: "3"
  services:
    app:
      image: app:latest
      restart: always
      links:
        - db
      ports:
        - "8001:8081"
      environment:
        - DB_HOST= db
      depends_on:
        - db

    db:
      image: mysql:5.7.26
      restart: always
      environment:
        MYSQL_DATABASE: 'my_db'
        MYSQL_USER: 'docker_root'
        MYSQL_PASSWORD: 'password'
        MYSQL_ROOT_PASSWORD: 'password'
      ports:
        - "3306:3306"
      volumes:
        - ./DB_config/:/etc/mysql/mysql.conf.d

И код вашего приложения должен выглядеть примерно так:

try:
    db.bind(provider='mysql', user='docker_root', password='password', host='db', database=database, port = 3306)
except:
    # write some logs
    exit(1)
1 голос
/ 23 мая 2019

Попробуйте использовать порт контейнера 3306 -

db.bind(provider='mysql', user='docker_root', password='password', host='db', database=database, port = 3306)

Кроме того, добавьте атрибут depends_on, вы можете удалить атрибут links -

 depends_on:
    - db
...