2017-08-22 15 views
1

このアプリケーションのpythonはドッカーのコンテナから実行されています。コンテナはネットワークモードで実行されています: "ホスト"。OSX El Capitan sqlalchemy '127.0.0.1'のMySQLサーバーに接続できません(111)

pythonパッケージのsqlalchemyを使用してMySQLデータベースに接続する際に問題があります。次のエラーが表示されます。

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

次の端末コマンドは、たぶん、SQLAlchemyのは、あなたが言う正しい構成を使用していない

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

正常に動作しますか?私は右のMySQLへの最初の接続の前にデバッグラインで設定をプリントアウトしています

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

たぶん、その構成はまだSQLAlchemyの中にそれを作っていませんか?エンジン文字列を出力します。

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) 

多分、1つ以上のバージョンのmysqlが実行されていますか?唯一のプロセスが実行されている:

ps -ef | grep mysql 

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

をたぶんそのユーザーは、データベースへのアクセス権を持っていないのですか?

mysql> select User, Host from mysql.user; 

+------+--------------------------+ 
| User | Host      | 
+------+--------------------------+ 
|my_user 127.0.0.1    | 
| root | 127.0.0.1    | 
| root | ::1      | 
|  | localhost    | 
| root | localhost    | 
+------+--------------------------+ 

同様に、 'show databases'は、dbが存在することを示します。私はすべてのデータベースに対して、そのユーザーにすべての個人を許可しました。私も私物を洗い流しました。

多分、何らかの種類のファイアウォールルールが接続を停止していますか?私は少しのスニチを使用し、ファイアウォール全体をテストしてこれをテストしました。

私はこの時点で何をデバッグすべきか分かりません。ここでは、接続エラーを投げPythonスクリプトの縮小版である:ここでは

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) 

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エルキャピタン10.11.6

+1

エラーを表示している実際のコードを表示できますか?または少なくともそれを縮小したものです。 –

+0

私は@ gsi-frankに同意します。単純なSQLAlchemyエンジンと[接続設定(ドキュメント内のような)]を使った縮小例です(http://docs.sqlalchemy.org/en/latest/core/connections.html# module-sqlalchemy.engine)はここで役立ちます(デバッグを簡略化するため、そしてここではSOの質問の両方)。 –

+0

@ gsi-frank done –

答えて

1

あなたが書いたコメントは非常に重要で、おそらく問題の理由です。

Dockerコンテナには、MySQLを実行しているOSXループバックインターフェイスとは異なる127.0.0.1というアドレスのループバックインターフェイスがあります。

あなたのコンテナの内部から見えるアドレスにリッスンすることをお勧めします。そのコンフィグを簡単にデバッグして、容器の中からtelnet ip_address 3306を作ることができます。

+0

誰かがこの手間を掛けたら、OSX上のDockerに--network = 'host'を使っても意図したとおりに動作せず、ドッカーOSXのDockerはVMを使用していますが、ここでは--network = 'host'引数が完全に壊れています。 Dockerフォーラムのコメントを読んで、この問題は無視され、これを解決するための今後の努力はありません。 –

関連する問題