gpt4 book ai didi

mysql - 在docker容器中导入mysql中的多个数据库模式

转载 作者:行者123 更新时间:2023-11-29 17:31:36 31 4
gpt4 key购买 nike

想要使用 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'@'%'访问数据库'core'被拒绝”)

最佳答案

问题出在密码中的@。您需要在 docker-compose.yml 中对其进行转义。Python 使用 @123 的密码,而 compose 对其的处理方式不同,因此不是您为 mysql 设置的正确密码。

检查容器中的环境变量以获取真正将其设置为密码的内容。

引用见:

https://symfony.com/doc/current/components/yaml/yaml_format.html :

Strings containing any of the following characters must be quoted. Although you can use double quotes, for these characters it is more convenient to use single quotes, which avoids having to escape any backslash :

:, {, }, [, ], ,, &, *, #, ?, |, -, <, >, =, !, %, @, `

http://yaml.org/spec/1.2/spec.html#id2772075 :

The “@” (#x40, at) and “`” (#x60, grave accent) are reserved for future use.

<小时/>

也许也有可能,但可能性较小:

出现这种情况是因为服务web执行python命令的那一刻,db服务中的mysqldb尚未设置。

请参阅 mysql docker 自述文件 ( https://hub.docker.com/_/mysql/ ):

No connections until MySQL init completes

If there is no database initialized when the container starts, then a default database will be created. While this is the expected behavior, this means that it will not accept incoming connections until such initialization completes. This may cause issues when using automation tools, such as docker-compose, which start several containers simultaneously.

尝试启动数据库服务(docker-compose up db)并等待几秒钟,然后尝试运行 Web 服务。

depends_on 指令仅等待容器启动 - docker 不知道容器内的服务何时“准备好” - 开发人员需要自己实现这一点。通常,您只需将 Web 容器设置为一遍又一遍地启动,直到最终成功(数据库将准备就绪)。

此外,尽管不太推荐,也可以在执行迁移脚本之前先进行 sleep 10 操作。

关于mysql - 在docker容器中导入mysql中的多个数据库模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50582308/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com