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

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

ただいまの
回答率

90.47%

  • Python

    12260questions

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

  • MySQL

    7142questions

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

  • Docker

    1084questions

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

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,170

pipo

score 8

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

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

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

import uuid
import mysql.connector
import json

db_config = {
    'host': 'localhost',
    'db': 'hogeDB',
    'user': 'hogeUser',
    'passwd': 'hogehoge',
    'charset': 'utf8',
}

with open('hoge.json', 'r') as jsonFile:
    preJsonFile = json.load(jsonFile)

    connection = mysql.connector.connect(**db_config)
    cursor = connection.cursor()

    〜以下略〜

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

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

version: "3"

volumes:
  hoge.db.volume:

services:
  db:
    build: ./mysql
    volumes:
      - ./mysql/init:/docker-entrypoint-initdb.d/:ro
      - hoge.db.volume:/var/lib/mysql
    ports:
      - 3306:3306
    environment:
      MYSQL_ROOT_PASSWORD: hoge
      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)
);

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

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

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

CMD ["mysqld −−ssl=0"]

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/11/28 07: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のユーザ設定に問題があるのかとも思いましたがよく分かりません。
    もう少しお力おかしいただけますか?

    キャンセル

  • 2018/11/28 08:56

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

    キャンセル

  • 2018/11/28 23:43

    なにが原因か分かりませんが、急に動き始めました!
    一応、やってみたことを書いておきます。

    ・最初は立ち上がったのに2回目から「mysqld −−ssl=0 が見つからない」といったようなエラーが表示され、dbサーバが立ち上がらなくなってしまいました。
    ・docker rmでコンテナを一回削除しました。
    ・CMD ["mysqld −−ssl=0"]→CMD ["mysqld"]に戻して再度dockerを立ち上げなおしました。

    すると、pythonから接続できるようになっていました。
    今回の問題の直接の解決策はよく分かっていないままなのでまたどこかのタイミングで詰まってしまう気もしますが、とりあえず助かりました!
    素早い返答ありがとうございました!

    キャンセル

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

  • ただいまの回答率 90.47%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Python

    12260questions

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

  • MySQL

    7142questions

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

  • Docker

    1084questions

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