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