Почему docker compose создает контейнер mysql с неправильным именем?

#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, я обычно не использую жирный шрифт, но здесь я почувствовал, что должен был сделать это в сообщении :). Риск того, что кто-то слепо скопирует вставку, реален 🙂