#mysql #docker #docker-compose
#mysql #docker #docker-compose
Вопрос:
Мне удалось создать контейнер MySQL и PHP, и мои скрипты выполняются, и все мои таблицы там.
Однако у меня есть база данных, которую я называю «myDb», и пользователь, который называется «someuser», и когда база данных создается по какой-то причине, имя базы данных — «somedatabase»
мой docker-compose.файл yaml:
services:
mysql:
image: mysql:latest
ports:
- 3307:3306
environment:
MYSQL_DATABASE: myDb
MYSQL_ROOT_PASSWORD: SomeRootPassword1!
MYSQL_USER: someuser
MYSQL_PASSWORD: Password1!
volumes:
- ./dbScript/winit_Script2.sql:/docker-entrypoint-initdb.d/winit_Script2.sql
- db_data:/var/lib/mysql
phpmyadmin:
image: phpmyadmin/phpmyadmin
container_name: dev_pma
links:
- mysql
environment:
PMA_HOST: mysql
PMA_PORT: 3307
PMA_ARBITRARY: 1
restart: always
ports:
- 8183:80
volumes:
db_data:
phpAdmin:
Mysqlworkbench:
Что я здесь сделал не так?
Небольшая правка после комментариев:
Казалось бы, при наличии раздела volumes вы создаете тома в docker, и когда вы создаете том на определенном порту один раз, он используется повторно каждый раз, когда вы выполняете docker-compose up. Это было для меня.
Более подробная информация в принятом ответе.
Комментарии:
1. Не могли бы вы, пожалуйста, поделиться журналом
docker compose up
команды? Особенноmysql
журналы контейнера.2. @NeoAnderson пожалуйста, просмотрите изменения
3. Я предполагаю, что вы
composing up
та же БД, у которой есть стараяsomedatabase
из предыдущего запуска. Можете ли вы проверить строку, сообщающую что-то вроде «init.sh выполнено» или наоборот «том уже содержит данные … пропуская инициализацию БД»? Я попытаюсь воспроизвести тем временем4. Я думаю, что он создаст базу данных с именем в
MYSQL_DATABASE
, только если том пуст. Поэтому, если вы можете позволить себе потерять эти данные, просто удалите том Docker, и он воссоздаст базу данных (вам, очевидно, придется выполнить миграцию и повторно заполнить таблицы).
Ответ №1:
Образ mysql не инициализирует базу данных, если объем не является чистым.
Когда вы останавливаете и запускаете базу данных из одного и того же файла compose, объем всегда один и тот же, следовательно, вы хотите, чтобы данные сохранялись даже после перезапуска приложения.
Чтобы принудительно выполнить повторную инициализацию данных, вы можете удалить этот том docker (только если вам больше не нужна эта база данных! это нельзя отменить):
Сначала остановите и удалите контейнеры.
Затем перечислите и удалите том, на котором сохраняется база данных:
docker volume ls
DRIVER VOLUME NAME
local <your-deployment-name>_db_data
docker volume rm <your-deployment-name>_db_data
Затем снова запустите docker-compose up
команду, и вы сможете найти myDb
в phpMyAdmin вместо somedb
Редактировать:
Если вы сами не измените entrypoint
и не перестроите образ, чтобы заставить его инициализировать вашу базу данных в соответствии с передаваемой вами средой, даже если объем не чистый, единственный вариант, который приходит мне на ум, — это создать новую базу данных вручную. Здесь указано условие, которое пропускает повторную инициализацию базы данных, и здесь приведен сценарий, который вызывается, если том чистый.
Комментарии:
1. Я попробую.
2. Это уничтожит вашу текущую базу данных! Делайте это, только если вам больше не нужна эта база данных
3. Боже… почему вы мне этого не сказали earlier…my бедные db … lol. Это помогло, большое спасибо.
4. @CodingLittle, я обычно не использую жирный шрифт, но здесь я почувствовал, что должен был сделать это в сообщении :). Риск того, что кто-то слепо скопирует вставку, реален
![]()