多分これが一番早いと思います。
$ docker run -ti python:3.8-slim bash
# pip install mysql-connector-python==8.0.20
# python
>>> import random
>>> import mysql.connector
Segmentation fault
何が起こっているのか。
前提
mysql-connector-pythonは8.0.20
からlibcrypto.so.1.1
とlibssl.so.1.1
をbundleするようになりました。
$ pip show -f mysql-connector-python | grep lib
Location: /usr/local/lib/python3.8/site-packages
mysql-vendor/libcrypto.so.1.1
mysql-vendor/libssl.so.1.1
解説
import random
random
をインポートすると libcrypto.so.1.1
をロードします。
この時はシステムにインストールされた libcrypto.so.1.1
をロードします。
import mysql.connector
このimport文でlibssl.so.1.1
とlibcrypto.so.1.1
をロードしようとします。
その際、libssl.so.1.1
はバンドルされた独自のものをロードするのですが、
libcrypto.so.1.1
はすでにロード済みなので、ロードしません。
したがって以下のような状態になります。
libcrypto.so.1.1 --> /usr/lib/x86_64-linux-gnu/libcrypto.so.1.1
libssl.so.1.1 --> /usr/local/lib/python3.8/site-packages/mysql-vendor/libssl.so.1.1
libcrypto.so.1.1
に互換性がないため、segmentation faultとなります。
すでにbugとして報告されています。
https://bugs.mysql.com/bug.php?id=97220
回避策
- LD_PRELOADで
/usr/local/lib/python3.8/site-packages/mysql-vendor/libssl.so.1.1
等を読み込む -
8.0.19
以前のバージョンを使う。
追記
別にrandomを読み込まなくてもセグフォすることがわかりました。
>>> import mysql.connector
Segmentation Fault
上記の理屈だと若干説明がつかないので原因は別にあるようです。
LD_PRELOADで回避できるのでバンドルされたライブラリに読み込み順序に何か問題があることは確かだと思います。
ちなみに、不思議なのですが、 python:3.8-slim
イメージでは発生しますが、 python:3.8
イメージでは発生しません。