Der obige Fehler trat auf, als ich die App in einer Docker-Umgebung startete und versuchte, von innen eine Verbindung zu einem externen MySQL (in diesem Fall Amazon Aurora) herzustellen. Abhängig vom Basis-Docker-Image wird möglicherweise ein Fehler angezeigt oder nicht. ..
Dieses Mal musste ich mit Docker eine Python-Umgebung erstellen, also habe ich sie aus dem offiziellen Image von Python 3.7.4 erstellt. Es geht nicht auf die Details der Anwendung ein, sondern verwendet Pandas für die Verarbeitung. Ich versuche, eine Verbindung mit mysql.connector herzustellen.
Docker (Debian-Basis), bei dem ein Fehler auftritt ↓
Dockerfile
FROM python:3.7.4-slim
RUN apt-get -y update && apt-get install -y --no-install-recommends \
apt-utils \
python-dev \
build-essential \
libpq-dev
RUN pip install --upgrade pip
RUN pip install --upgrade setuptools
COPY requirements.txt /tmp/
RUN pip install -r /tmp/requirements.txt
Kein Fehler Docker (Alpenbasis) ↓
Dockerfile
FROM python:3.7.4-alpine3.10
RUN apk --update-cache add \
bash \
gcc \
g++ \
gfortran \
postgresql-dev \
openblas-dev \
freetype-dev
RUN pip install --upgrade pip
RUN pip install --upgrade setuptools
COPY requirements.txt /tmp/
RUN pip install -r /tmp/requirements.txt
Python-Code des Verbindungsteils ↓
main.py
#Auszug
import mysql.connector as my
myconfig = {
'user': 'user',
'password': 'your_password',
'host': 'your_host',
'database' : 'your_db',
}
conn = my.connect(**myconfig)
Wenn es auf Alpine basiert, braucht es viel Zeit, um C-Serien wie Numpy und Pandas zum Zeitpunkt des Builds zu erstellen. Deshalb wollte ich daraus ein Debian-basiertes Docker-Image machen.
Für MySQL 5.6 / 5.7 scheint die unterstützte TLS-Version TLSv1.1 zu entsprechen. [2] Changes in MySQL Connector/Python 8.0.18 (2019-10-14, General Availability)
In Debian ist die Standardeinstellung für openssl TLSv1.2, was beim Herstellen einer Verbindung zu einem Fehler geführt hat.
Es gibt zwei Lösungsmuster.
Dockerfile
FROM python:3.7.4-slim
RUN apt-get -y update && apt-get install -y --no-install-recommends \
apt-utils \
python-dev \
build-essential \
libpq-dev
#Wechselpunkt
RUN apt-get update -yqq \
&& apt-get install -y --no-install-recommends openssl \
&& sed -i 's,^\(MinProtocol[ ]*=\).*,\1'TLSv1.0',g' /etc/ssl/openssl.cnf \
&& rm -rf /var/lib/apt/lists/*
RUN pip install --upgrade pip
RUN pip install --upgrade setuptools
COPY requirements.txt /tmp/
RUN pip install -r /tmp/requirements.txt
Informationen zu den TLS-Standardeinstellungen von Debian [1] Debian openssl-1.1.1
Informationen zum Python MySQL Connector-Update [2] Changes in MySQL Connector/Python 8.0.18 (2019-10-14, General Availability)
So untersuchen Sie den Fehlerinhalt und ändern den eingestellten Wert [3] SSL routines:ssl_choose_client_version:unsupported protocol
Ich habe nicht verstanden, warum Alpine den Fehler nicht bekommen hat. Ich kann nichts wie die TLS-Standardeinstellungen in etc / ssl / openssl.cnf finden. .. .. Möglicherweise werden Sie aufgefordert, das Protokoll zu studieren. Wenn jedoch keine Standardeinstellung vorhanden ist, wird die TLS-Version ausgewählt und eine Verbindung zu Ihnen hergestellt.
Wenn jemand die Ursache kennt, möchte ich Sie bitten, zu unterrichten.
Recommended Posts