在docker容器中的mysql中导入多个数据库模式
要使用backup.sql上载多个数据库架构。然后,当尝试迁移时,显示(1044,“拒绝用户'pranay'@“%”对数据库'core'的访问) 我添加了文件的快照以供参考在docker容器中的mysql中导入多个数据库模式,mysql,docker,docker-compose,Mysql,Docker,Docker Compose,要使用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.sq
***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
设置.py
步骤如下: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设置的正确密码
检查容器中的env变量,以了解compose真正将其设置为密码的内容
有关参考资料,请参阅:
:
必须引用包含以下任何字符的字符串。虽然可以使用双引号,但对于这些字符,使用单引号更方便,从而避免转义任何反斜杠:
:,{,},[,],&,*,#,?,|,-,=,!,%,@`
:
“@”(#x40,at)和“`”(#x60,重重音)保留供将来使用
也有可能,但可能性较小: 这是因为当服务
web
执行python命令时,mysqldb-in-db服务尚未设置
请参阅mysql docker自述文件():
在MySQL初始化完成之前没有连接
如果容器启动时没有初始化数据库,则
将创建默认数据库。虽然这是预期的行为,
这意味着它将不接受传入连接,直到
初始化完成。这可能会导致使用自动化时出现问题
启动多个容器的工具,如docker compose
同时
尝试启动数据库服务(docker compose up db)并给它几秒钟时间,然后尝试运行web服务
dependens\u on
指令只等待容器启动-docker不知道容器内的服务何时“准备就绪”-开发人员需要自己实现这一点。通常,您只需将web容器设置为一次又一次地启动,直到它最终成功(db将准备就绪)
另外,尽管不太推荐,但在执行迁移脚本之前只需执行
sleep 10
。我更改了密码,删除了“@”,并先运行数据库,然后运行web,现在在迁移时,我得到了django.db.utils.OperationalError:(1130,“主机'172.24.0.3'不允许连接到此MySQL服务器”)但是我没有在我的项目中的任何地方使用这个IP这是web
容器的IP。您需要在数据库中允许用户从任何主机连接,而不仅仅是数据库中通常默认的“localhost”。在docker images中,从数据库的角度来看,其他服务总是从“外部”连接。谢谢,通过在/etc/mysql/conf.d中更改my.cnf文件已经解决了这个问题
CREATE DATABASE `core` ;
CREATE DATABASE `murad` ;
CREATE DATABASE `mysqltest` ;
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'core',
'USER':'pranay',
'PASSWORD':'mobigo@123',
'HOST':'db',
'PORT':'',
}
}