在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版本4:
manage.py runserver 127.0.0.1:8000
错误
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
2条答案
按热度按时间u59ebvdq1#
在容器中使用
healthcheck.sh
,使用MARIADB_MYSQL_LOCALHOST_USER=1
创建一个mysql@localhost
用户,脚本可以使用该用户访问数据库,运行状况检查将一直等待,直到完全启动,而不考虑时间。
生成文件:
试运行:
注:添加了
MARIADB_PASSWORD
,否则将不会创建数据库/用户。pqwbnv8z2#
这个问题可能是由于争用条件造成的,Django试图在数据库准备好之前连接到数据库。请尝试在启动Docker容器后等待几秒钟。
简单的解决方案
生成文件
使用www.example.com的更好解决方案healthcheck.sh
在Dan Black's answer中,他指出MariaDB docker容器包含一个脚本healthcheck.sh。
如果您只想检查MariaDB容器是否可以接收连接,则可以在不指定用户的情况下运行
healthcheck.sh
(避免授权复杂化)。下面的Makefile将每秒检查一次数据库连接,直到数据库就绪。
Makefile(高级版本)