Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Dockerfile-MySQL中创建动态用户_Mysql_Node.js_Docker_Dockerfile_Dbmigrate - Fatal编程技术网

在Dockerfile-MySQL中创建动态用户

在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

我正在尝试解决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\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
...