Search code examples
dockermysql-connector-python

python Mysql.connector doesn´t connect BUT mysql server is up and working


This is the docker-compose file

version: '3.3'
services:
  mysql:
    image: mysql:latest
    restart: always
    environment:
      MYSQL_DATABASE: 'bot'
      MYSQL_USER: 'user'
      MYSQL_PASSWORD: '123'
      MYSQL_ROOT_PASSWORD: 'root'
    ports:
      - '3306:3306'
    expose:
      - '3306'
    volumes:
      - mybot:/var/lib/mysql
  
  python:    
    restart: always
    build: .
    environment:
      MYSQL_DATABASE: 'bot'
      MYSQL_USER: 'user'
      MYSQL_PASSWORD: '123'
      MYSQL_ROOT_PASSWORD: 'root'
    volumes:
      - mybot:/usr/app
    command: tail -f /dev/null
volumes:
  mybot:

and Dockerfile

FROM python

user root
WORKDIR /usr/src
COPY requirements.txt ./
RUN apt-get update && apt-get install -y python3 python3-pip
RUN pip3 install -r requirements.txt
RUN mkdir -p new
COPY . ./new

Now, when I run sh terminal from python container, i had access to mysql database without problem (before that i manually installed default-mysql-server)

mysql -u user -p -u 172.X.X.X
mysql>

and also i am able to ping between containers with no errors, BUT when I run main.py I get the following error

mysql.connector.errors.InterfaceError: 2055: Lost connection to MySQL server at '172.X.X.X:3306', system error: 1 [SSL: TLSV1_ALERT_PROTOCOL_VERSION] tlsv1 alert protocol version (_ssl.c:1123)

main.py is connecting to mysql like this

self.mydb = mysql.connector.connect(host=params["host"],
                                            user=params["user"],
                                            password=params["pass"],
                                            database=params["database"])

and mysql my.cnf file has this custom lines

port = 3306
bind-address = 172.X.X.X

"outside" docker containers, everything works great.. Thank you!


Solution

  • This seems to be a bug in the mysql-connector that occurs in some versions.
    The easiest way to workaround this is to switch to pymysql

    Install pymysql

    pip install pymysql
    

    Simple select example:

    import pymysql
    
    connection = pymysql.connect(user='user', passwd='pass', host='host', database='database')
    cursor = connection.cursor()
    query = ("SELECT * FROM myTable")
    cursor.execute(query)
    for item in cursor:
        print item