2017-08-22 4 views
1

Le python de cette application s'exécute à partir d'un conteneur docker. Le conteneur fonctionne en mode réseau: "host".OSX El Capitan sqlalchemy Impossible de se connecter au serveur MySQL sur '127.0.0.1' (111)

J'ai des problèmes pour me connecter à une base de données MySQL via le paquet python sqlalchemy. Je reçois l'erreur suivante.

OperationalError: (OperationalError) (2003, "Can't connect to MySQL server on '127.0.0.1' (111)") None None

utilisant la commande suivante fonctionne très bien

mysql -h 127.0.0.1 -u my_user --password='password' db -e "SHOW TABLES;" 
enter code here 

Peut-être que sqlalchemy n'utilise pas la configuration correcte, vous dites? Je l'ai imprimé la configuration dans une ligne de débogage juste avant la première connexion à MySQL:

print config.get('repository', 'host') // 127.0.0.1 
    print config.get('repository', 'user') // my_user 
    print config.get('repository', 'passwd') // password 

Peut-être que la configuration est toujours pas en faire sqlalchemy? Permet d'imprimer la chaîne du moteur

engine = getUnaffiliatedEngine() 
    print engine //Engine(mysql://my_user:***@127.0.0.1:3306) 
    with engine.connect() as connection: 
    for s in statements: 
     if s.strip(): 
     connection.execute(s) 

Peut-être y a-t-il plus d'une version de mysql en cours d'exécution? Un seul processus est en cours d'exécution:

ps -ef | grep mysql 

74 15459 1 0 10:14AM ?? 0:00.80 /usr/local/mysql/bin/mysqld --user=_mysql

Peut-être que l'utilisateur n'a pas accès à la base de données? De même, 'show databases' montre que la base de données existe. J'ai accordé tous les privilèges à cet utilisateur pour chaque base de données. J'ai aussi vidé les privs.

Peut-être qu'une sorte de règle de pare-feu arrête la connexion? J'utilise un petit vif, et tout le pare-feu a été démonté pour le tester.

Je ne sais même pas quoi d'autre à déboguer à ce stade. Voici une version réduite du script python jeter l'erreur de connexion:

DSN_FORMAT = "mysql://%(user)s:%(passwd)[email protected]%(host)s:%(port)s" 

def getDSN(): 
    return DSN_FORMAT % dict(config.items("repository")) 

def getUnaffiliatedEngine(): 
    return create_engine(getDSN()) 

def reset(offline=False): 
    config.loadConfig() 
    dbName = config.get('repository', 'db') 
    print config.get('repository', 'host') 
    print config.get('repository', 'user') 
    print config.get('repository', 'passwd') 

    resetDatabaseSQL = (
     "DROP DATABASE IF EXISTS %(database)s; " 
     "CREATE DATABASE %(database)s;" % {"database": dbName}) 
    statements = resetDatabaseSQL.split(";") 

    engine = getUnaffiliatedEngine() 
    print engine 
    with engine.connect() as connection: 
    for s in statements: 
     if s.strip(): 
     connection.execute(s) 

Voici la sortie pour tcpdump -i lo0 port 3306:

11:44:41.224036 IP localhost.58797 > localhost.mysql: Flags [P.], seq 3915736486:3915736498, ack 2134634265, win 12519, options [nop,nop,TS val 980567261 ecr 980503692], length 12 
11:44:41.224105 IP localhost.mysql > localhost.58797: Flags [.], ack 12, win 12737, options [nop,nop,TS val 980567261 ecr 980567261], length 0 
11:44:41.224178 IP localhost.mysql > localhost.58797: Flags [P.], seq 1:19, ack 12, win 12737, options [nop,nop,TS val 980567261 ecr 980567261], length 18 
11:44:41.224218 IP localhost.58797 > localhost.mysql: Flags [.], ack 19, win 12519, options [nop,nop,TS val 980567261 ecr 980567261], length 0 
11:45:07.422776 IP localhost.58796 > localhost.mysql: Flags [P.], seq 2953728354:2953728366, ack 432872138, win 12483, options [nop,nop,TS val 980593366 ecr 980533534], length 12 
11:45:07.422807 IP localhost.mysql > localhost.58796: Flags [.], ack 12, win 12729, options [nop,nop,TS val 980593366 ecr 980593366], length 0 
11:45:07.422856 IP localhost.mysql > localhost.58796: Flags [P.], seq 1:19, ack 12, win 12729, options [nop,nop,TS val 980593366 ecr 980593366], length 18 
11:45:07.422877 IP localhost.58796 > localhost.mysql: Flags [.], ack 19, win 12482, options [nop,nop,TS val 980593366 ecr 980593366], length 0 

MySQL 5.6 OSX El Capitan 10.11.6

+1

Pourriez-vous montrer le code réel qui donne l'erreur? Ou au moins une version réduite de celui-ci. –

+0

Je suis d'accord avec @ gsi-frank - un exemple réduit avec juste le moteur SQLAlchemy simple et [configuration de la connexion (comme dans ses docs)] (http://docs.sqlalchemy.org/en/latest/core/connections.html# module-sqlalchemy.engine) serait utile ici (à la fois pour vous simplifier le débogage, et pour la question ici sur SO). –

+0

@ gsi-frank done –

Répondre

1

Ce dernier commentaire que vous avez écrit est très important et probablement la raison du problème.

Je suis à peu près certain que votre conteneur Docker possède sa propre interface de bouclage avec une adresse 127.0.0.1 différente de votre interface de bouclage OSX sur laquelle vous avez exécuté MySQL.

Je vous recommande d'écouter MySQL sur une adresse visible de l'intérieur de votre conteneur. Vous pouvez déboguer facilement cette configuration en créant telnet ip_address 3306 depuis l'intérieur de votre conteneur.

+0

Si quelqu'un trébuche sur cela, en utilisant --network = 'host' pour Docker sur OSX ne fonctionne pas comme prévu, et il ne sera pas fixé par Docker. Docker sur OSX utilise des VM, l'argument --network = 'host' est complètement cassé ici. En lisant les commentaires sur les forums Docker, le problème est ignoré et il n'y aura pas d'efforts pour résoudre ce problème. –