在 Dockerfile 中创建动态用户 - MySQL

Posted

技术标签:

【中文标题】在 Dockerfile 中创建动态用户 - MySQL【英文标题】:Creating Dynamic user inside the Dockerfile - MySQL 【发布时间】:2018-12-04 06:41:28 【问题描述】:

我正在尝试解决 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 中的 cmets):

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;

【问题讨论】:

你的问题是什么 如何将变量传递给 setupsql,以创建用户。 你应该授予每个用户自己的 sql 文件来导入,这样事情就保持透明。减少代码冗余并不总是好的——在这种情况下,它实际上是坏的。不要尝试通过这种导入动态添加用户。 通常你已经为每个版本的事物编号了 SQL 文件。喜欢:001-task-1234-basic-structure.sql002-task-9999-altered-users-column.sql003-task-1111-added-user-dev.sql,... 能否说得更具体些? 【参考方案1】:

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

因此,您为获得最终架构所采取的每一步都是可重现和可重复的。

【讨论】:

以上是关于在 Dockerfile 中创建动态用户 - MySQL的主要内容,如果未能解决你的问题,请参考以下文章

使用动态用户输入在 html5 中创建画布多边形

想要在 codeigniter 中创建动态子域?

如何使作曲家在容器中创建非root用户拥有的文件?

在As3中创建一个动态表

如何在sails.js 中创建动态策略

在 PHP 中创建动态 PayPal 立即购买按钮