2017-02-02 5 views
0

Я пытаюсь о соединении MariaDB с питоном использованием Докер-Compose:MariaDB докер контейнер не удается подключиться к серверу MySQL на хосте (111 Connection отказался) с Python

докер-compose.yml

version: '2' 
    services: 
     mariadb: 
     image: bitnami/mariadb 
     ports: 
      - "3306:3306" 
     environment: 
      MARIADB_DATABASE: 'mary_db' 
      MARIADB_USER: user2 
      MARIADB_PASSWORD: 'pass1234' 
     consumer: 
      build: ./consumer 
      links: 
      - mariadb 

consumer.py

import mysql.connector as mariadb1 

    mariadb_connection = mariadb1.connect(host='mariadb', 
            port=3306, 
           user='user2', 
           password='pass1234', 
           database='mary_db') 

    cursor = mariadb_connection.cursor(buffered=True) 

    try: 
     cursor.execute('DROP TABLE names') 
    except: 
     pass 

    comm = "CREATE TABLE names(id VARCHAR(20), location VARCHAR(100)," \ 
    "PRIMARY KEY (mac,location)) ENGINE=InnoDB" 

    cursor.execute(comm) 
    print 'created' 

EntryPoint Dockerfile просто вызывает функцию consumer.py как:

ENTRYPOINT python -u consumer.py 

Проблема очень случайным образом (более 90% проб), питон код не может соединиться с базой данных и выводит сообщение об ошибке:

File "consumer.py", line 7, in database='mary_db') File "/usr/local/lib/python2.7/dist-packages/mysql/connector/init.py", line 179, in connect return MySQLConnection(*args, **kwargs) File "/usr/local/lib/python2.7/dist-packages/mysql/connector/connection.py", line 95, in init self.connect(**kwargs) File "/usr/local/lib/python2.7/dist-packages/mysql/connector/abstracts.py", line 719, in connect self._open_connection() File "/usr/local/lib/python2.7/dist-packages/mysql/connector/connection.py", line 206, in _open_connection self._socket.open_connection() File "/usr/local/lib/python2.7/dist-packages/mysql/connector/network.py", line 475, in open_connection errno=2003, values=(self.get_address(), _strioerror(err))) mysql.connector.errors.InterfaceError: 2003: Can't connect to MySQL server on 'mariadb:3306' (111 Connection refused)

Любая идея, что происходит?

+1

Возможный дубликат [Невозможно подключиться к серверу базы данных (MySQL Workbench)] (HTTP : //stackoverflow.com/questions/7864276/cannot-connect-to-database-server-mysql-workbench) – Shadow

+0

Поскольку это сообщение об ошибке mysql или mariadb, не имеет значения, получает ли python или приложение gui сообщение об ошибке, курица дублировать. – Shadow

+0

@ Shadow Я не думаю, что это дубликат; Вопрос в Docker, и настройка отличается. – salehinejad

ответ

0

Проблема не в коде базы данных или Python; Это проблема повышения, возникающая из Docker, поскольку для загрузки базы данных требуется некоторое время, а контейнер python (consumer.py) запускается быстрее, чем база данных.

Возможные решения:

докер Healthcheck

WaitTime в докер

добавить задержку в питона потребителя