Пользователь не создается в MySQL при использовании docker-compose

Вот что я вижу, когда нахожусь в контейнере, созданном docker-compose:

mysql> SELECT user FROM mysql.user;
+------+
| user |
+------+
| root |
+------+
1 row in set (0.00 sec)

root@541e4d686184:/# echo $MYSQL_USER
dbuser

Таким образом, dbuser отсутствует в таблице пользователей, хотя $MYSQL_USER установлен правильно.

В docker-compose.yml у меня есть это:

version: '2'
services:
  db:
    image: mysql:latest
    environment:
      MYSQL_DATABASE: mydb
      MYSQL_USER: dbuser
      MYSQL_PASSWORD: userpass
      MYSQL_ROOT_PASSWORD: password
    ports:
      - "3306"
    volumes:
      - ./docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d
      - my-datavolume:/var/lib/mysql
volumes:
  my-datavolume:

Я ожидал, что dbuser будет создан автоматически, но этого не произошло.

У меня также есть файл sql для создания моей базы данных и таблиц, если они еще не существуют, но прямо сейчас tomcat не может подключиться к моей базе данных.

Те же симптомы, что и в этом вопросе, но я уже использую словарь для своих имен пользователей/паролей.

ОБНОВЛЕНИЕ:

Я приближаюсь. Внутри контейнера я вручную сделал:

/docker-entrypoint-initdb.d/create_users.sh 

Затем пользователь был создан внутри таблицы MySQL, и я смог развернуть свое приложение на своем сервере tomcat, и я не получил ошибку об отказе в доступе dbuser.

Итак, почему я должен был запускать эту команду сам, она должна запускаться docker-compose, согласно документы mysql docker в разделе Инициализация нового экземпляра.


person James Black    schedule 31.12.2016    source источник
comment
Вы проверили вывод docker logs? Логи mysql? Рассматривали ли вы проблемы с правами пользователей? Рассматривали ли вы возможность использования клиента mysql для запуска вашего сценария sql? (например, /usr/bin/mysql < /path/to/script.sql)   -  person mlg    schedule 31.12.2016
comment
@mlg - я видел, что он пытался создать этого нового пользователя, но пароль пользователя root сработал. Я могу добавить пользователя вручную, через Dockerfile, я просто не хотел этого делать, если это возможно.   -  person James Black    schedule 31.12.2016
comment
сценарии sql хороши не только для создания пользователей; это может оказаться хорошей вещью, имеющей сценарий запуска. Предвидите ли вы необходимость каких-то дополнительных действий при запуске? Это может избавить вас от всего этого.   -  person mlg    schedule 01.01.2017
comment
@mig - Нет, другого применения я не вижу, но на данный момент это работает так. Я могу сохранить образ докера с настроенной базой данных, а затем просто развернуть его, чтобы все оставалось правильно. Мне не нравится этот вариант, но, похоже, он может быть моим лучшим.   -  person James Black    schedule 01.01.2017
comment
У меня такая же проблема. Раньше отлично работало, а теперь вот это. Я не знаю почему.   -  person Dolanor    schedule 26.04.2017
comment
Та же проблема для меня прямо сейчас. Пользователь не создан в БД.   -  person Pete_Gore    schedule 26.01.2018


Ответы (6)


Как насчет:

docker-compose down -v

Из документации:

-v — удалить тома, объявленные в разделе томов файла Compose.

Ваша база данных уже создана внутри тома, поэтому любые изменения в вашем docker-compose.yml не будут отражены.

Если вы хотите удалить только один том, вы можете использовать docker volume ls для вывода списка всех существующих томов, а затем docker volume rm <VOLUME NAME> для его удаления.

Примечание. монтирование привязки не удаляется с флагом -v , поэтому, если вы используете их вместо томов, вам придется вручную удалить папки, содержащие MySQL данные.

person adrihanu    schedule 24.02.2019
comment
Отличное предложение. Спас мой день! Используйте docker-compose down -v docker-compose up --build для перестроения образа - person Vladimir Zotov; 23.03.2019
comment
Примечание: монтирование привязки не удаляется с флагом -v, поэтому вам придется вручную удалить содержимое монтирования. Это застало меня врасплох гораздо дольше, чем я хотел бы признать. - person XtraSimplicity; 09.10.2019
comment
После нескольких часов борьбы я рад, что наткнулся на ваш ответ! Большое спасибо. - person Luis Milanese; 19.11.2019

У меня сработало: остановить докер и вручную удалить всю папку, содержащую данные MySQL из предыдущих сборок.

Также: не забудьте добавить переменную среды MYSQL_DATABASE, иначе она не создаст указанного вами пользователя.

person Pete_Gore    schedule 26.01.2018

проблема с Github

Важно отметить, что сценарий точки входа изображения никогда не будет вносить изменения в существующую базу данных. Если вы монтируете существующий каталог данных в var/lib/mysql, такие параметры, как MYSQL_ROOT_PASSWORD, не будут иметь никакого эффекта.

person Vallie    schedule 27.05.2020
comment
Как тогда монтировать том для постоянного хранения?... - person Brandon Ros; 03.03.2021

Я столкнулся с той же проблемой, вы можете попробовать удалить все в «my-datavolume», потому что среда работает только на начальном этапе, что означает, что в «/var/lib/mysql» не должно быть никаких данных. Этот подход работал для меня.

person Summer    schedule 30.07.2020

Что сработало для меня:

docker-compose down
docker volume ls
docker volume rm <volume-name>
docker-compose up -d

Во вновь созданном томе был мой пользователь.

person Rohit Suthar    schedule 04.11.2020

после моего тестирования,

  1. создайте init.sql и ссылки на /docker-entrypoint-initdb.d

  2. docker-compose down
    docker volume ls
    docker volume rm
    docker-compose up -d

тогда все в порядке

person Winking yuan    schedule 23.07.2021