想要使用backup.sql上传多个数据库模式。然后当尝试迁移时显示(1044,“拒绝用户'pranay'@'%'访问数据库'core'”) 我添加了我的文件快照以供参考
***docker-compose.yml***
version: '3'
services:
db:
image: mysql:5.7
container_name: mirror_core
volumes:
- ./mirror/core.sql:/docker-entrypoint-initdb.d/core.sql:rw
- ./mysql:/var/lib/mysql:rw
expose:
- "3306"
restart: always
environment:
- MYSQL_ROOT_PASSWORD=mobigo@123
- MYSQL_USER=pranay
- MYSQL_PASSWORD=mobigo@123
web:
build: .
container_name: mirrorweb
command: bash -c "python manage.py collectstatic --no-input && gunicorn mirror.wsgi -b 0.0.0.0:8000"
links:
- db
volumes:
- ./mirror:/mirror
expose:
- "8000"
depends_on:
- db
core.sql
CREATE DATABASE `core` ;
CREATE DATABASE `murad` ;
CREATE DATABASE `mysqltest` ;
settings.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'core',
'USER':'pranay',
'PASSWORD':'mobigo@123',
'HOST':'db',
'PORT':'',
}
}
步骤如下:docker-compose build>> docker-compose up>> docker-compose exec web bash>> python manage.py migrate(在docker容器内) 关于迁移获取错误(1044,“拒绝用户'pranay'@'%'到数据库'核心'”)
答案 0 :(得分:0)
问题是密码中的@
。你需要在你的docker-compose.yml中使用它来使用密码和@ 123,而compose对它的处理方式不同,因此不是你为mysql设置的正确密码。
检查容器中的env变量,以获得真正将其设置为密码的组合。
供参考:
https://symfony.com/doc/current/components/yaml/yaml_format.html:
必须引用包含以下任何字符的字符串。虽然你可以使用双引号,但对于这些字符,使用单引号更方便,这样就不必转义任何反斜杠:
:,{,},[,] ,,,&,*,#,?,|, - ,<,>,=,!,%,@,`
http://yaml.org/spec/1.2/spec.html#id2772075:
“@”(#x40,at)和“`”(#x60,重音符号)保留供将来使用。
也许也可能,但不太可能:
这是因为服务web
执行python命令时,db服务中的mysqldb尚未设置。
请参阅mysql docker readme(https://hub.docker.com/_/mysql/):
在MySQL init完成之前没有连接
如果容器启动时没有初始化数据库,那么a 将创建默认数据库。虽然这是预期的行为, 这意味着它不会接受传入的连接,直到这样 初始化完成。使用自动化时可能会出现问题 工具,例如docker-compose,它启动了几个容器 同时进行。
尝试启动数据库服务(docker-compose up db)并给它几秒钟,然后尝试运行Web服务。
depends_on
指令只等待容器启动 - 当容器内的服务“准备好”时,docker不知道 - 开发人员需要自己实现它。通常,您只需将Web容器设置为反复启动,直到它最终成功(db将准备就绪)。
另外,不太建议,只是在执行迁移脚本之前提供sleep 10
。