【问题标题】:django.db.utils.OperationalError when running MySQL/MariaDB in Docker: Lost connection to MySQL server at 'reading initial communication packet'在 Docker 中运行 MySQL/MariaDB 时出现 django.db.utils.OperationalError:在“读取初始通信数据包”时失去与 MySQL 服务器的连接
【发布时间】:2022-07-20 03:24:47
【问题描述】:

在本地运行 Django 版本 4:

manage.py runserver 127.0.0.1:8000

在 Docker 容器中运行 MySQL/MariaDB:

docker run -p 3306:3306 --name $(DATABASE_NAME) -v /tmp/mysql:/var/lib/mysql -e MYSQL_DATABASE=$(DATABASE_NAME) -e MYSQL_USER=$(DATABASE_USER) -e MYSQL_ROOT_PASSWORD=$(DATABASE_PASSWORD) -d mariadb:latest > /dev/null

错误

django.db.utils.OperationalError: (2013, "Lost connection to MySQL server at 'reading initial communication packet', system error: 2")

我可以使用 MySQL Workbench 以及命令成功连接到数据库:

mysql -h 127.0.0.1 -P 3306 -u root -p <database>

我正在从 Makefile 启动 Django 和 MySQL/MariaDB Docker 容器。

生成文件

SHELL := /bin/bash

.PHONY: dj-start-local
dj-start-local: start-mysql
    PYTHONPATH=. django_project/src/manage.py runserver 127.0.0.1:8000

.PHONY: start-mysql
start-mysql:
    docker run -p 3306:3306 --name $(DATABASE_NAME) -v /tmp/mysql:/var/lib/mysql -e MYSQL_DATABASE=$(DATABASE_NAME) -e MYSQL_USER=$(DATABASE_USER) -e MYSQL_ROOT_PASSWORD=$(DATABASE_PASSWORD) -d mariadb:latest > /dev/null

【问题讨论】:

    标签: mysql django docker mariadb


    【解决方案1】:

    问题可能是由于竞争条件造成的,即 Django 在数据库准备好之前尝试连接到数据库。启动 Docker 容器后尝试等待几秒钟。

    生成文件

    .PHONY: start-mysql
    start-mysql:
        docker run -p 3306:3306 --name $(DATABASE_NAME) -v /tmp/mysql:/var/lib/mysql -e MYSQL_DATABASE=$(DATABASE_NAME) -e MYSQL_USER=$(DATABASE_USER) -e MYSQL_ROOT_PASSWORD=$(DATABASE_PASSWORD) -d mariadb:latest > /dev/null
        sleep 4
    

    【讨论】:

      猜你喜欢
      • 2014-01-15
      • 2012-06-25
      • 1970-01-01
      • 2011-10-09
      • 2011-11-23
      • 2015-06-29
      • 2011-07-07
      • 2011-08-10
      相关资源
      最近更新 更多