ローカルホスト(ubuntu 16.04)でmysqlデータベースを実行しています。同じホスト上に、Pythonスクリプトが実行されているDockerコンテナーがあります。このスクリプトは、ローカルホスト上のmysqldbに接続する必要があります。これらの投稿(post1、post2)で説明されているように、ローカルデータベースにbind-address = 0.0.0.0を設定し、ローカルホストのIPアドレスを見つけて、Pythonスクリプトで使用してデータベースに接続しましたが、うまくいかない。以下に、セットアップとDockerコンテナーの実行方法を示します。私のPythonスクリプト(analysis.py)は次のようになります。
import pandas as pd
import sqlalchemy as db
def find_max_age():
cnx = db.create_engine('mysql+mysqlconnector://root:[email protected]:3306/datasets')
cnx_res = db.create_engine('mysql+mysqlconnector://root:[email protected]:3306/results')
df = pd.read_sql("select * from test_table", cnx)
idx = df['age'].idxmax() == df.index
df_res = df[idx]
df_res.to_sql('max_age4', con=cnx_res, index=False)
if __name__ == '__main__':
find_max_age()
私のDockerfileは次のように見えます:
FROM python:2.7-slim
EXPOSE 80 3306
WORKDIR /app
COPY requirements.txt /app
RUN pip install -r requirements.txt
COPY analysis.py /app
CMD python analysis.py
最後に、requirements.txtは次のようになります
mysql-connector-python
sqlalchemy
pandas
Dockerイメージを次のように作成します。
docker build -t max_age_app .
次に、このイメージを使用してコンテナーを次のように開始します。
docker run -d max_age_app:latest
コンテナは終了コード1で終了し、コンテナのそれぞれのログを見ると、次のエラーが見つかります。
> Traceback (most recent call last):
File "analysis.py", line 24, in <module>
find_max_age()
File "analysis.py", line 11, in find_max_age
df = pd.read_sql("select * from test_table", cnx)
File "/usr/local/lib/python2.7/site-packages/pandas/io/sql.py", line 397, in read_sql
chunksize=chunksize)
File "/usr/local/lib/python2.7/site-packages/pandas/io/sql.py", line 1063, in read_query
result = self.execute(*args)
File "/usr/local/lib/python2.7/site-packages/pandas/io/sql.py", line 954, in execute
return self.connectable.execute(*args, **kwargs)
File "/usr/local/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 2074, in execute
connection = self.contextual_connect(close_with_result=True)
File "/usr/local/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 2123, in contextual_connect
self._wrap_pool_connect(self.pool.connect, None),
File "/usr/local/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 2162, in _wrap_pool_connect
e, dialect, self)
File "/usr/local/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 1476, in _handle_dbapi_exception_noconnection
exc_info
File "/usr/local/lib/python2.7/site-packages/sqlalchemy/util/compat.py", line 265, in raise_from_cause
reraise(type(exception), exception, tb=exc_tb, cause=cause)
File "/usr/local/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 2158, in _wrap_pool_connect
return fn()
File "/usr/local/lib/python2.7/site-packages/sqlalchemy/pool.py", line 400, in connect
return _ConnectionFairy._checkout(self)
File "/usr/local/lib/python2.7/site-packages/sqlalchemy/pool.py", line 788, in _checkout
fairy = _ConnectionRecord.checkout(pool)
File "/usr/local/lib/python2.7/site-packages/sqlalchemy/pool.py", line 529, in checkout
rec = pool._do_get()
File "/usr/local/lib/python2.7/site-packages/sqlalchemy/pool.py", line 1193, in _do_get
self._dec_overflow()
File "/usr/local/lib/python2.7/site-packages/sqlalchemy/util/langhelpers.py", line 66, in __exit__
compat.reraise(exc_type, exc_value, exc_tb)
File "/usr/local/lib/python2.7/site-packages/sqlalchemy/pool.py", line 1190, in _do_get
return self._create_connection()
File "/usr/local/lib/python2.7/site-packages/sqlalchemy/pool.py", line 347, in _create_connection
return _ConnectionRecord(self)
File "/usr/local/lib/python2.7/site-packages/sqlalchemy/pool.py", line 474, in __init__
self.__connect(first_connect_check=True)
File "/usr/local/lib/python2.7/site-packages/sqlalchemy/pool.py", line 671, in __connect
connection = pool._invoke_creator(self)
File "/usr/local/lib/python2.7/site-packages/sqlalchemy/engine/strategies.py", line 106, in connect
return dialect.connect(*cargs, **cparams)
File "/usr/local/lib/python2.7/site-packages/sqlalchemy/engine/default.py", line 412, in connect
return self.dbapi.connect(*cargs, **cparams)
File "/usr/local/lib/python2.7/site-packages/mysql/connector/__init__.py", line 172, in connect
return CMySQLConnection(*args, **kwargs)
File "/usr/local/lib/python2.7/site-packages/mysql/connector/connection_cext.py", line 78, in __init__
self.connect(**kwargs)
File "/usr/local/lib/python2.7/site-packages/mysql/connector/abstracts.py", line 731, in connect
self._open_connection()
File "/usr/local/lib/python2.7/site-packages/mysql/connector/connection_cext.py", line 179, in _open_connection
sqlstate=exc.sqlstate)
sqlalchemy.exc.DatabaseError: (mysql.connector.errors.DatabaseError) 2003 (HY000): Can't connect to MySQL server on '172.17.0.1' (111) (Background on this error at: http://sqlalche.me/e/4xp6)
localhostのIPを判別するために、ifconfig
コマンドを使用しました。これにより、次のような結果が得られました。
docker0 Link encap:Ethernet HWaddr 02:42:a2:a6:d7:ff
inet addr:172.17.0.1
enp0s3 Link encap:Ethernet HWaddr 08:00:27:bb:7e:b5
inet addr:10.0.2.15
lo Link encap:Local Loopback
inet addr:127.0.0.1
そこで、コンテナ内からローカルデータベースに接続するために172.17.0.1を試しましたが、機能しませんでした。
コンテナ-p
を起動するときに、オプションを介してコンテナとローカルホストの間のポートを一致させる必要がありますか?
助けていただければ幸いです。
この問題を解決するには、ローカルホストでmysqlデータベースを正しく構成する必要があります。上で説明したことに加えて、次の手順を実行する必要があります。
docker inspect <container_name>
。その後、コマンドでコンテナを起動するだけdocker run -d max_age_app
で、Pythonスクリプトがローカルホスト上のデータベースにデータを書き込むことができます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加