Контейнер Python-Docker не может подключиться к контейнеру MariaDB-Docker - PullRequest
1 голос
/ 03 ноября 2019

Я пытаюсь получить свой докеризованный скрипт на python для получения данных также из докеризированной mariadb.

Я знаю, что это должно быть возможно с сетями или ссылками. Однако из-за того, что ссылки устарели (согласно документации Docker ), я бы предпочел не использовать ссылки.

docker-compose:

version: "3.7"

services:

[...]

 mariadb:
   build: ./db
   container_name: maria_db
   expose: 
     - 3306
   environment:
     MYSQL_ROOT_PASSWORD: root
     MYSQL_USER: user
     MYSQL_PASSWORD: user
   restart: always
   networks:
       - logrun_to_mariadb
[...]

 logrun_engine:
   build: ./logrun_engine
   container_name: logrun_engine
   restart: always
   networks:
     - logrun_to_mariadb

networks:
   logrun_to_mariadb:
       external: false
       name: logrun_to_mariadb

The *Контейнер 1011 * при запуске выполняет python-скрипт:

import mysql.connector as mariadb

class DBConnector:
   def __init__(self, dbname):
       self.mariadb_connection = mariadb.connect(host='mariadb', port='3306', user='root', password='root', database=dbname)
       self.cursor = self.mariadb_connection.cursor()

   def get_Usecases(self):
       self.cursor.execute("SELECT * FROM Test")
       tests = []
       for test in self.cursor:
           print(test) 
       print("Logrun-Engine running...")

test = DBConnector('test_db')
test.get_Usecases()

При каждом запуске docker-compose up -d в моих журналах logrun_engine появляется сообщение об ошибке:

_mysql_connector.MySQLInterfaceError: Can't connect to MySQL server on 'mariadb' (111)

Когда я запускаюСценарий Python локально и подключиться к локальной mariadb, он работает без проблем, поэтому сценарий должен быть правильным.

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

Я пробовал с мостовыми сетями, хост-сетями, ссылками и т. д., но, видимо, я еще не нашел правильную вещь.

Есть идеи, каксоединить эти два контейнера?

Ответы [ 2 ]

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

Спи, может быть, одно решение. Тем не менее, это может быть проблематично, если дБ медленно повышается.

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

Выполнить:

docker-compose up -d agent

После активации агента вы уверены, что база данных работает, и ваше приложение может работать:

docker-compose up -d logrun_engine

Решение использует --links, однако его можно легко изменить для использования в докерских сетях.

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

ОК, поэтому я был слишком нетерпелив и не позволил mysql правильно запуститься перед запросом базы данных, спасибо @DanielFarrel за то, что указал на это. Когда я добавил 10-секундную задержку в скрипт python перед запросом к базе данных, он волшебным образом работал ...

...