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

在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

要使用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

设置.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':'',
    }
}