Создание динамического пользователя внутри Dockerfile - MySQL - PullRequest
0 голосов
/ 25 июня 2018

Я пытаюсь решить проблему с 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;

1 Ответ

0 голосов
/ 26 июня 2018

Docker используется способом DevOps, где цель в отношении инфраструктуры заключается в том, чтобы инфраструктура в виде кода была бы детерминированной и повторяемой .

Это означает, что когда вы вводите изменение SQL, вы добавляете его как новый шаг .Вы не изменяете существующие файлы SQL.Таким образом, весь смысл динамического создания ваших пользователей далек от лучшей практики.

Поскольку ваш пользователь из whoami является детерминированным (= вы знаете имя пользователя до того, как настроите контейнер), нет необходимости добавлять егокак-то динамически.

Когда вы вводите нового пользователя в свой контейнер, вы создаете новый файл SQL для импорта.Лучше всего нумеровать файлы и импортировать их один за другим.

Пример:

001-2017-10-21-basic-schema-added.sql
002-2017-10-29-added-dev-user.sql
003-2018-01-01-altered-import-table.sql
004-2018-01-09-added-temp-table.sql
...

Таким образом, каждый ваш шаг к полученной схеме воспроизводим и повторяем.

...