在dockerfile中创建动态用户-mysql

h79rfbju  于 2021-06-24  发布在  Mysql
关注(0)|答案(1)|浏览(456)

我正在尝试解决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):用户“\u mysql”@“172.20.0.1”的访问被拒绝(使用密码:否)
有时:
错误1045(28000):用户“\u spotligth”@'172.20.0.1”的访问被拒绝(使用密码:否)
主要是我的mac用户名(主登录名):
错误1045(28000):拒绝访问用户“xx”@“172.20.0.1”(使用密码:否)
我在setup.sql中设置的那些用户根本没有使用过。另外,mysql\u config\u editor语句似乎没有任何效果。
它将工作,如果我添加(手动)一个例如我的loginname作为一个用户。目前我没有这个问题,因为我正在构建dev环境。
因此,我计划进行动态用户创建,大致如下(请阅读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;
zaqlnxep

zaqlnxep1#

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
...

因此,您为获得结果模式而采取的每一步都是可复制和可重复的。

相关问题