我尝试使用 docker 连接 Mysql 和 django,但出现此错误
2061, 'RSA Encryption not supported - caching_sha2_password plugin was built with GnuTLS support'.
我尝试更改用户并使用
创建数据库// create a user //
CREATE USER 'user'@'localhost' IDENTIFIED BY 'user';
GRANT ALL PRIVILEGES ON *.* TO 'user'@'localhost' WITH GRANT OPTION;
CREATE USER 'user'@'%' IDENTIFIED BY 'user';
GRANT ALL PRIVILEGES ON *.* TO 'user'@'%' WITH GRANT OPTION;
// create a database //
CREATE DATABASE user_db;
但仍然是 sqme 错误消息
在settings.py中
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'user_db',
'USER': 'user',
'PASSWORD': 'user',
'HOST': 'db',
'PORT': '3306',
}
}
在 docker-compose 中:
db:
image: mysql:latest
environment:
MYSQL_DATABASE: 'user_db'
MYSQL_USER: 'user'
MYSQL_PASSWORD: user
MYSQL_ROOT_PASSWORD: root
volumes:
- ./data/mysql/db:/var/lib/mysql
ports:
- 3306:3306
谢谢您的帮助。
我已经解决了这个问题,将连接器更改为
mysql-connector-python==8.0.26
而不是mysqlclient==2.0.3
还有连接设置
DATABASES = {
'default': {
#'ENGINE': 'django.db.backends.mysql',
'ENGINE': 'mysql.connector.django',
'NAME': getenv('MYSQL_DATABASE'),
'USER': getenv('MYSQL_USER'),
'PASSWORD': getenv('MYSQL_PASSWORD'),
'HOST': 'db',
'PORT': getenv('MYSQL_PORT', 3306),
'OPTIONS': {
'auth_plugin': 'mysql_native_password'
}
}
}
似乎是 Debian 版本问题。 将“FROM”python 映像设置为 3.10.8-slim-bullseye 允许我保留:caching_sha2_password、MySql-8、mysqlclient 本机驱动程序。
FROM python:3.10.8-slim-bullseye
我在我的 docker 文件中添加了
RUN apt-get update && apt-get upgrade -y
,它解决了所有问题。
您只需在构建之前在容器中运行命令
apt-get update && apt-get upgrade -y
即可。
用途:
DATABASES = {
'default': {
#'ENGINE': 'django.db.backends.mysql',
'ENGINE': 'mysql.connector.django',
'NAME': getenv('MYSQL_DATABASE'),
'USER': getenv('MYSQL_USER'),
'PASSWORD': getenv('MYSQL_PASSWORD'),
'HOST': 'db',
'PORT': getenv('MYSQL_PORT', 3306),
'OPTIONS': {
'auth_plugin': 'mysql_native_password'
}
}
}
或在您的 DSN 中添加:
mysql://USER:PASS@HOST(:PORT)/DATABASE?auth_plugin=mysql_native_password
我对 docker-compose 和两个服务(web 和 db)也有同样的问题。我使用的是 Mysql 8.0 图像,对于 django,我使用的是 python:3-10-buster。
我通过将网络图像更改为 python:3-10-bullseye 解决了这个问题。