Я пытаюсь решить проблему с Docker и MySQL.
У меня есть файл Docker:
FROM mysql:5.6
ADD setup.sql /docker-entrypoint-initdb.d
RUN apt-get -qq update && apt-get install -y expect
RUN echo "test" | unbuffer -p mysql_config_editor set --login-path=mydb_db_test --host=mydb-mysql --user=test --password
, а также соответствующий файл SQL:
CREATE SCHEMA IF NOT EXISTS `mydb` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
CREATE SCHEMA IF NOT EXISTS `mydb_test` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
CREATE USER 'dev'@'%' IDENTIFIED BY 'dev';
CREATE USER 'dev'@'localhost' IDENTIFIED BY 'dev';
CREATE USER 'test'@'%' IDENTIFIED BY 'test';
CREATE USER 'test'@'localhost' IDENTIFIED BY 'test';
FLUSH PRIVILEGES;
GRANT ALL ON mydb.* TO 'dev'@'%';
GRANT ALL ON mydb_test.* TO 'test'@'%';
FLUSH PRIVILEGES;
Я использую Node.js и модуль db-migrate. Проблема в том, что когда я запускаю тесты, я не могу подключиться к экземпляру MySQL. Всегда одна и та же проблема. Кажется, что он использует различные логины и терпит неудачу, поскольку они не существуют:
Иногда он использует:
ОШИБКА 1045 (28000): доступ запрещен для пользователя '_mysql'@'172.20.0.1'
(используя пароль: НЕТ)
Иногда:
ОШИБКА 1045 (28000): доступ запрещен для пользователя '_spotligth'@'172.20.0.1'
(используя пароль: НЕТ)
И в основном мое имя пользователя Mac (основной логин):
ОШИБКА 1045 (28000): доступ запрещен для пользователя 'XXXXX'@'172.20.0.1' (используется
пароль: НЕТ)
Те пользователи, которых я настроил в setup.sql, никогда не используются вообще. Кроме того, оператор mysql_config_editor, похоже, не имеет никакого эффекта.
Это будет работать, если я добавлю (вручную), например, свое имя пользователя в качестве пользователя. В настоящее время у меня нет проблем с этим, так как я создаю среду разработки.
Поэтому я планировал создать динамическое пользовательское создание, что-то вроде этого (пожалуйста, прочитайте комментарии в Dockerfile):
FROM mysql:5.6
RUN currentLocalUserCredentials=$(whoami)
RUN echo currentLocalUserCredentials
# So I have my user name in the variable
ADD setup.sql /docker-entrypoint-initdb.d
#How do I pass it to setup.sql???
RUN apt-get -qq update && apt-get install -y expect
RUN echo "test" | unbuffer -p mysql_config_editor set --login-path=mydb_db_test --host=mydb-mysql --user=test --password
Чтобы я мог сделать это:
CREATE SCHEMA IF NOT EXISTS `mydb` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
CREATE SCHEMA IF NOT EXISTS `mydb_test` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
userLoginName = received from the Dockerfile
CREATE USER 'dev'@'%' IDENTIFIED BY 'dev';
CREATE USER 'dev'@'localhost' IDENTIFIED BY 'dev';
CREATE USER userLoginName@'%' IDENTIFIED BY 'test';
CREATE USER userLoginName@'localhost' IDENTIFIED BY 'test';
FLUSH PRIVILEGES;
GRANT ALL ON mydb.* TO 'dev'@'%';
GRANT ALL ON mydb_test.* TO userLoginName@'%';
FLUSH PRIVILEGES;