要使用backup.sql上载多个数据库架构。然后,当尝试将showing(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
核心.sql
CREATE DATABASE `core` ;
CREATE DATABASE `murad` ;
CREATE DATABASE `mysqltest` ;
设置.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容器内)on migrate get error as(1044,“拒绝用户'pranay'@“%”访问数据库'core')
1条答案
按热度按时间brjng4g31#
问题在于
@
在密码里。您需要在docker-compose中转义它。yml python使用带有@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命令,mysqldb-in-db服务尚未设置。请参阅mysql docker自述(https://hub.docker.com/_/mysql/):
在mysql init完成之前没有连接
如果容器启动时没有初始化数据库,则将创建默认数据库。虽然这是预期的行为,但这意味着在初始化完成之前,它不会接受传入连接。在使用自动化工具(如docker compose)同时启动多个容器时,这可能会导致问题。
尝试启动db服务(docker compose up db)并给它几秒钟时间,然后尝试运行web服务。
这个
depends_on
指令只等待容器启动-docker不知道容器中的服务何时“就绪”-开发人员需要自己实现。通常您只需将web容器设置为反复启动,直到它最终成功(db将准备就绪)。另外,不管推荐的有多少,也只是给出一个建议
sleep 10
在执行迁移脚本之前。