質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

6300閲覧

DockerのmysqlにPythonでアクセスできない

pipo

総合スコア16

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2018/11/26 14:53

編集2018/11/26 15:01

Dockerを用いて、mysqlを構築しました。

そこに、ローカルでPythonを動かしてjsonデータを挿入しようとしたのですがうまく動きません。

Pythonは次のプログラムを書きました。

python

1import uuid 2import mysql.connector 3import json 4 5db_config = { 6 'host': 'localhost', 7 'db': 'hogeDB', 8 'user': 'hogeUser', 9 'passwd': 'hogehoge', 10 'charset': 'utf8', 11} 12 13with open('hoge.json', 'r') as jsonFile: 14 preJsonFile = json.load(jsonFile) 15 16 connection = mysql.connector.connect(**db_config) 17 cursor = connection.cursor() 18 19 〜以下略〜

すると次のようなエラーが表示されてしまいました。

Traceback (most recent call last): File "..../lib/python3.6/site-packages/mysql/connector/connection_cext.py", line 176, in _open_connection self._cmysql.connect(**cnx_kwargs) _mysql_connector.MySQLInterfaceError: SSL connection error: SSL_CTX_set_tmp_dh failed During handling of the above exception, another exception occurred: Traceback (most recent call last): File "..../Documents/PycharmProjects/jsonToMySQL/jsonToMySQL.py", line 18, in <module> connection = mysql.connector.connect(**db_config) File "..../lib/python3.6/site-packages/mysql/connector/__init__.py", line 172, in connect return CMySQLConnection(*args, **kwargs) File "..../lib/python3.6/site-packages/mysql/connector/connection_cext.py", line 78, in __init__ self.connect(**kwargs) File "..../lib/python3.6/site-packages/mysql/connector/abstracts.py", line 731, in connect self._open_connection() File "..../lib/python3.6/site-packages/mysql/connector/connection_cext.py", line 179, in _open_connection sqlstate=exc.sqlstate) mysql.connector.errors.InterfaceError: 2026 (HY000): SSL connection error: SSL_CTX_set_tmp_dh failed

立ち上がったDockerのmysqlに入って

# mysql

と打つと

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)

とエラーが出てしまいます。
解決法が分かりません。アドバイスよろしくお願いします。
調べてみると、
「/var/run/mysqld/mysqld.sockがないからそれを置けばいい」
というような記事も見かけたのですが、できればdockerを立ち上げた最初の状態でうまく動作させたいです。

ローカルでターミナルから次のように打つと、mysqlを操作することはできるので、立ち上がってはいると思うのですが、、

$ mysql -h localhost --port 3306 --protocol tcp -u hogeUser -p

Dockerの構築は次のようにしています。

. ├── docker-compose.yml └── mysql ├── Dockerfile ├── my.cnf └──init └──init.sql

docker-compose.yml

docker

1version: "3" 2 3volumes: 4 hoge.db.volume: 5 6services: 7 db: 8 build: ./mysql 9 volumes: 10 - ./mysql/init:/docker-entrypoint-initdb.d/:ro 11 - hoge.db.volume:/var/lib/mysql 12 ports: 13 - 3306:3306 14 environment: 15 MYSQL_ROOT_PASSWORD: hoge 16 TZ: "Asia/Tokyo"

Dockerfile

FROM mysql # 設定ファイルの読み込み COPY ./my.cnf /etc/mysql/conf.d/my.cnf CMD ["mysqld"]

my.cnf

[mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock symbolic-links=0 sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES character-set-server = utf8 default_authentication_plugin= mysql_native_password [client] default-character-set = utf8 [mysqldump] default-character-set = utf8 [mysql] default-character-set = utf8 [mysqld_safe] log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid

init.sql

create user hogeUser identified by 'hogehoge'; CREATE DATABASE hogeDB; grant all privileges on hogeDB.* to hogeUser@'%'; use hogeDB; CREATE TABLE hoge_table ( name VARCHAR(20), hoge VARCHAR(10) );

長くなってしまうので、必要ないと考える部分は省略しましたが、足りない情報があればご指摘ください。
サーバー周りについての知識がまだ全然乏しいので見当違いのことを聞いているかもしれませんが、よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

「python mysql SSL_CTX_set_tmp_dh」で検索しました。

https://stackoverflow.com/questions/53385113/django-db-utils-operationalerror-2026-ssl-connection-error-ssl-ctx-set-tmp

mysql_ssl_rsa_setupを実施していないために発生する、とのことです。

「mysql Docker ssl error」で検索しました。

https://github.com/docker-library/mysql/issues/379

以下のようにオプションを追加することでひとまず回避はできそうですが、もちろんセキュリティ的には甘くなります。

Dockerfile

1CMD ["mysqld −−ssl=0"]

投稿2018/11/26 23:27

kazto

総合スコア7196

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pipo

2018/11/27 22:15

ありがとうございます! CMD ["mysqld −−ssl=0"] これを追加してみたところ、エラー文に変化がありました。 mysql.connector.errors.DatabaseError: 2003 (HY000): Can't connect to MySQL server on 'localhost' (61) 「localhost」ではなく、「127.0.0.1」にも変えてみたりしましたが、ダメでした。 https://qiita.com/saken649/items/00e752d89f2a6c5a82f6 ↑を参考にしてみて、mysqlのユーザ設定に問題があるのかとも思いましたがよく分かりません。 もう少しお力おかしいただけますか?
kazto

2018/11/27 23:56

あとは、問題の切り分けとしてはinit.sqlが実行されていない疑いが考えられますかね。 このsql文をDockerに入った上で手動で実行した後、スクリプトを実行するとどうなるでしょうか。
pipo

2018/11/28 14:43

なにが原因か分かりませんが、急に動き始めました! 一応、やってみたことを書いておきます。 ・最初は立ち上がったのに2回目から「mysqld −−ssl=0 が見つからない」といったようなエラーが表示され、dbサーバが立ち上がらなくなってしまいました。 ・docker rmでコンテナを一回削除しました。 ・CMD ["mysqld −−ssl=0"]→CMD ["mysqld"]に戻して再度dockerを立ち上げなおしました。 すると、pythonから接続できるようになっていました。 今回の問題の直接の解決策はよく分かっていないままなのでまたどこかのタイミングで詰まってしまう気もしますが、とりあえず助かりました! 素早い返答ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問