セグフォルト、ところでなぜ?これはdebian:stretch + mysql.connector + toxとPython3.xでのみ発生します。再生には数行しか必要ありません。
FROM debian:stretch
RUN apt update -y && apt install -y make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev xz-utils tk-dev libffi-dev liblzma-dev gcc wget tox vim python-pip python3-pip
RUN wget https://www.python.org/ftp/python/3.6.9/Python-3.6.9.tgz
RUN tar xvf Python-3.6.9.tgz && cd Python-3.6.9 &&./configure --enable-optimizations --enable-shared --with-ssl --with-ensurepip=install && make -j8 && make altinstall
RUN mkdir /tox-test && echo "[tox]" >> /tox-test/tox.ini && echo "envlist = py36" >> /tox-test/tox.ini && echo "[testenv]" >> /tox-test/tox.ini && echo "deps=" >> /tox-test/tox.ini
RUN echo " mysql-connector-python" >> /tox-test/tox.ini && echo "commands=python3.6 setup.py test" >> /tox-test/tox.ini
RUN mkdir /tox-test/tests && touch /tox-test/tests/__init__.py && echo "import faulthandler\nfaulthandler.enable()\nimport mysql.connector as mysql" >> /tox-test/tests/test_segfault.py
RUN echo "mysql.connect(host='localhost', user='joe', password='bloggs')" >> /tox-test/tests/test_segfault.py
RUN mkdir /tox-test/foo && echo "print('foo')" >> /tox-test/foo/foo.py
RUN echo "from setuptools import setup" >> /tox-test/setup.py && echo "setup( name='foo',version='1.0',description='A module',author='Niklas R.',author_email='[email protected]',packages=['foo'],test_suite='tests',)" >> /tox-test/setup.py
RUN cd /tox-test && export LD_LIBRARY_PATH=/Python-3.6.9 && tox
上記の内容によりセグフォルトが発生しました。 UbuntuとDebian Jessieの場合は、動作または解決できます。 Stretchでなぜこれが起こるのか理解できず、解決することもできません。 「localhost」の代わりに「127.0.0.1」を書くと競合が発生しないため、segfaultはネットワークに関連しているようです。理解するのを手伝ってください。私の考えでは、インポートがSSLまたは同様の独自のバージョンを非表示または使用しているようです。これは非常に不思議なことです。 Ubuntuでも再現可能であり、さらに奇妙な話は、Ubuntuからwerkzeug.exceptions import BadRequestKeyError
Pythonをインポートせずに追加して使用せずにインポートすると、Segfallが修正されることです。 mysql-connector-pythonをPyMySQLに置き換えるとうまくいきます。したがって、これはmysql-connector-pythonの内容でなければなりません。このコネクタに関する同様のバグレポートがあります。https://bugs.mysql.com/bug.php?id=97220
文字列「localhost」を「127.0.0.1」に変更すると、セグフォルトはなくなります。
FROM debian:stretch
RUN apt update -y && apt install -y make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev xz-utils tk-dev libffi-dev liblzma-dev gcc wget tox vim python-pip python3-pip
RUN wget https://www.python.org/ftp/python/3.6.9/Python-3.6.9.tgz
RUN tar xvf Python-3.6.9.tgz && cd Python-3.6.9 &&./configure --enable-optimizations --enable-shared --with-ssl --with-ensurepip=install && make -j8 && make altinstall
RUN mkdir /tox-test && echo "[tox]" >> /tox-test/tox.ini && echo "envlist = py36" >> /tox-test/tox.ini && echo "[testenv]" >> /tox-test/tox.ini && echo "deps=" >> /tox-test/tox.ini
RUN echo " mysql-connector-python" >> /tox-test/tox.ini && echo "commands=python3.6 setup.py test" >> /tox-test/tox.ini
RUN mkdir /tox-test/tests && touch /tox-test/tests/__init__.py && echo "import faulthandler\nfaulthandler.enable()\nimport mysql.connector as mysql" >> /tox-test/tests/test_segfault.py
RUN echo "mysql.connect(host='127.0.0.1', user='joe', password='bloggs')" >> /tox-test/tests/test_segfault.py
RUN mkdir /tox-test/foo && echo "print('foo')" >> /tox-test/foo/foo.py
RUN echo "from setuptools import setup" >> /tox-test/setup.py && echo "setup( name='foo',version='1.0',description='A module',author='Niklas R.',author_email='[email protected]',packages=['foo'],test_suite='tests',)" >> /tox-test/setup.py
RUN cd /tox-test && export LD_LIBRARY_PATH=/Python-3.6.9 && tox
答え1
最初はソケットの問題のように見えましたが、Socket.gethostbyname(host_name)は機能します。もう少し調べた後、問題が「mysql-connector-python」に限定されていることがわかり、tox.iniから「mysql-connector-python-rf」に変更するとエラーが消えます。これは、mysql-connector-pythonのどこかでDNSをIPとして解決できないことを意味します。