在Dockerfile-MySQL中创建动态用户
我正在尝试解决Docker和MySQL的一个问题 我有Docker文件:在Dockerfile-MySQL中创建动态用户,mysql,node.js,docker,dockerfile,dbmigrate,Mysql,Node.js,Docker,Dockerfile,Dbmigrate,我正在尝试解决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-m
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\u config\u editor语句似乎没有任何效果
如果我(手动)添加一个,例如作为用户添加我的loginname,它将起作用。目前我没有这个问题,因为我正在构建开发环境
因此,我计划进行动态用户创建,大致如下(请阅读Dockerfile中的注释):
所以我可以这样做:
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;
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
...
因此,获取结果模式所采取的每一步都是可复制和可重复的。您的问题是什么?我如何将变量传递给setupsql以创建用户。您应该授予每个用户自己的sql文件以进行导入,这样才能保持透明。减少代码冗余并不总是好的——在这种情况下,它实际上是坏的。不要试图通过这种导入动态添加用户。通常情况下,每个版本的SQL文件都有编号。例如:
001-task-1234-basic-structure.sql
,002-task-9999-altered-users-column.sql
,003-task-1111-added-user-dev.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
...