хотите загрузить несколько схем базы данных, используя backup.sql. Затем, когда вы пытаетесь перенести показ (1044, "Доступ запрещен для пользователя" pranay '@'% 'к ядру базы данных'), я добавил моментальный снимок моих файлов для справки
***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 (в контейнере докера) при миграции получить ошибку как (1044, "Запрет доступа для пользователя" pranay '@'% 'в базу данных' core '')
Проблема заключается в @
в пароле. Вам нужно сбежать от него в 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 в db еще не настроена.
См. Mysql docker readme (https://hub.docker.com/_/mysql/):
Нет соединений до завершения инициализации MySQL
Если база данных не инициализируется при запуске контейнера, будет создана база данных по умолчанию. Хотя это ожидаемое поведение, это означает, что он не будет принимать входящие соединения, пока эта инициализация не завершится. Это может вызвать проблемы при использовании инструментов автоматизации, таких как сборка докеров, которые запускают несколько контейнеров одновременно.
Попробуйте запустить db-службу (docker-compose up db) и дать ей несколько секунд, а затем попытаться запустить веб-службу.
Директива depends_on
только ожидает запуска контейнера - докер не знает, когда служба внутри контейнера будет "готова" - разработчик должен реализовать это самостоятельно. Обычно вы просто устанавливаете веб-контейнер для запуска снова и снова, пока он, наконец, не удастся (db будет готов).
Кроме того, как ни менее рекомендуется, просто дайте sleep 10
прежде чем выполнять сценарий миграции.
web
контейнера. Вам нужно разрешить в БД для пользователя подключаться с любого хоста, а не только с «localhost», как это обычно используется в базах данных по умолчанию. В образах докеров другие сервисы всегда подключаются извне с точки зрения базы данных.