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

ix0qys7i  于 2021-06-23  发布在  Mysql
关注(0)|答案(1)|浏览(360)

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

brjng4g3

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 在执行迁移脚本之前。

相关问题