我正在尝试解决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;
1条答案
按热度按时间zaqlnxep1#
docker是以devops的方式使用的,其中关于基础设施的目标是,基础设施作为代码应该是确定的和可重复的。
这意味着,当您引入一个sql更改时,您会将其作为一个新步骤追加。不更改现有sql文件。因此,动态创建用户的整个意义远远不是最佳实践。
作为您的用户
whoami
是确定性的(=在设置容器之前知道用户名),不需要以某种方式动态添加它。在容器中引入新用户时,将创建一个要导入的新sql文件。最好的办法是给文件编号,然后一个接一个地导入。
例子:
因此,您为获得结果模式而采取的每一步都是可复制和可重复的。