Mariadb docker容器无法使用Python连接到主机上的MySQL服务器(111连接被拒绝)

问题描述:

我正在尝试使用docker-compose与python连接mariadb:

I am trying the connect mariadb with python using docker-compose:

docker-compose.yml

docker-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

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'

Dockerfile入口点只是在调用Consumer.py函数,例如:

The Dockerfile entrypoint is just calling the consumer.py function like:

    ENTRYPOINT python -u consumer.py

问题是非常随机的(超过90%的试验),python代码无法与数据库连接并显示此错误:

The problem is very randomly (more than %90 of trials), python code cannot connect with database and prints this error:

文件"consumer.py",第7行,在 database ='mary_db')文件"/usr/local/lib/python2.7/dist-packages/mysql/connector/init.py", 179行,在连接中 返回MySQLConnection(* args,** kwargs)文件"/usr/local/lib/python2.7/dist-packages/mysql/connector/connection.py", 第95行,在 init 中 self.connect(** kwargs)文件"/usr/local/lib/python2.7/dist-packages/mysql/connector/abstracts.py", 719行,在连接中 self._open_connection()文件"/usr/local/lib/python2.7/dist-packages/mysql/connector/connection.py", _open_connection中的第206行 self._socket.open_connection()文件"/usr/local/lib/python2.7/dist-packages/mysql/connector/network.py", 第475行,在open_connection中 errno = 2003,值=(self.get_address(),_strioerror(err)))mysql.connector.errors.InterfaceError:2003:无法连接到MySQL "mariadb:3306"上的服务器(111连接被拒绝)

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)

知道发生了什么吗?

问题不出在数据库或Python代码上.这是来自Docker的一个大问题,因为数据库需要一些时间来加载,并且python(consumer.py)容器的启动速度要比数据库高.

The problem is not with Database or Python code; Its a raise problem coming from Docker, as database needs some time to load and python (consumer.py) container launches faster than database one.

可能的解决方案:

docker healthcheck

docker healthcheck

在docker中的等待时间

waittime in docker

为python使用者增加了延迟

add a delay to the python consumer