Изменение пароля mysql в контейнере Docker

Как я могу изменить пароль root в контейнере докера, так как контейнер автоматически останавливается после остановки службы mysql.

Должен ли я остановить контейнер mysql и развернуть новый?

Ответ 1

Вы можете изменить его из запущенного контейнера, используя сеанс docker exec, как описано в разделе "Подключение к MySQL Server из контейнера"

Как только сервер будет готов, вы можете запустить клиент mysql в контейнере MySQL Server, который вы только что запустили, и подключить его к MySQL Server.
Используйте команду docker exec -it, чтобы запустить клиента mysql в контейнере Docker, который вы запустили, например:

docker exec -it mysql1 mysql -uroot -p

При появлении запроса введите сгенерированный пароль root (см. инструкции выше, как его найти). Поскольку опция MYSQL_ONETIME_PASSWORD по умолчанию имеет значение true, после того, как вы запустили контейнер сервера с примером команды выше и подключили клиент mysql к серверу, вы должны сбросить корневой пароль сервера, выполнив этот оператор для MySQL 5.7 и выше:

mysql> update user set authentication_string=password('new_password') where user='root';

или альтернативно запустить,

mysql> SET PASSWORD FOR 'root' = PASSWORD('new_password');

Для MySQL 5.7 и более ранних версий запустите

mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'newpassword';

Замените newpassword паролем на ваш выбор. После сброса пароля сервер готов к использованию.

Обратите внимание, что приведенная выше команда изменит пароль только для пользователя root, подключающегося с хоста localhost. Вы можете проверить это с помощью команды:

select * from mysql.user;

Чтобы изменить пароль для пользователя root со всех хостов, используйте:

ALTER USER 'root'@'%' IDENTIFIED BY 'newpassword';

Затем, как описано вhub.docker.com/mysql, не забывайте секреты докера:

В качестве альтернативы передаче конфиденциальной информации через переменные среды _FILE может быть добавлен к ранее перечисленным переменным среды, в результате чего скрипт инициализации загружает значения этих переменных из файлов, присутствующих в контейнере.
В частности, это можно использовать для загрузки паролей из секретов Docker, хранящихся в файлах /run/secrets/<secret_name>.
Например:

$ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD_FILE=/run/secrets/mysql-root -d mysql:tag