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

时间:2018-05-29 10:39:23

标签: 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.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'@'%'到数据库'核心'”)

1 个答案:

答案 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