在 Dockerfile 中创建动态用户 - MySQL
Creating Dynamic user inside the Dockerfile - MySQL
我正在尝试解决 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 实例。总是一样的问题。它似乎使用了各种登录名,但由于不存在而失败:
有时它使用:
ERROR 1045 (28000): Access denied for user '_mysql'@'172.20.0.1'
(using password: NO)
有时:
ERROR 1045 (28000): Access denied for user '_spotligth'@'172.20.0.1'
(using password: NO)
主要是我的 Mac 用户名(主要登录名):
ERROR 1045 (28000): Access denied for user 'XXXXX'@'172.20.0.1' (using
password: NO)
我在 setup.sql 中设置的那些用户根本没有使用过。此外,mysql_config_editor 声明似乎根本没有效果。
如果我(手动)添加一个例如我的登录名作为用户,它将起作用。目前我没有问题,因为我正在构建开发环境。
所以我计划创建动态用户,大致如下(请阅读 Docker 文件中的注释):
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;
Docker 以 DevOps 方式使用,其中关于基础设施的 objective 即 基础设施即代码 应该是 确定性和可重复.
这意味着,当您引入 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
...
因此,您为获得结果架构而采取的每一步都是可重现和可重复的。
我正在尝试解决 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 实例。总是一样的问题。它似乎使用了各种登录名,但由于不存在而失败: 有时它使用:
ERROR 1045 (28000): Access denied for user '_mysql'@'172.20.0.1' (using password: NO)
有时:
ERROR 1045 (28000): Access denied for user '_spotligth'@'172.20.0.1' (using password: NO)
主要是我的 Mac 用户名(主要登录名):
ERROR 1045 (28000): Access denied for user 'XXXXX'@'172.20.0.1' (using password: NO)
我在 setup.sql 中设置的那些用户根本没有使用过。此外,mysql_config_editor 声明似乎根本没有效果。
如果我(手动)添加一个例如我的登录名作为用户,它将起作用。目前我没有问题,因为我正在构建开发环境。
所以我计划创建动态用户,大致如下(请阅读 Docker 文件中的注释):
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;
Docker 以 DevOps 方式使用,其中关于基础设施的 objective 即 基础设施即代码 应该是 确定性和可重复.
这意味着,当您引入 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
...
因此,您为获得结果架构而采取的每一步都是可重现和可重复的。