【问题标题】:docker secret workflow in mysql containermysql容器中的docker秘密工作流程
【发布时间】:2023-04-05 17:18:02
【问题描述】:

我是 docker 新手,想尝试在 Swarm 上通过 MySql 容器使用 docker secrets。

我使用 docker-compose.yml 启动 MySql。并在此处使用 .sql 脚本:

我在 docker-swarm 上使用最新版本的 debian。我在 CLI 中使用 echo "password" 创建了秘密 | docker-secret 创建“秘密”-

脚本在这里:

I'm in docker-swarm on debian with latest versions. I created secrets in CLI with echo "password" | docker-secret create "secret" -

And the script is here :

CREATE DATABASE IF NOT EXISTS mailserver
  CHARACTER SET = 'utf8mb4';

USE mailserver;
CREATE TABLE IF NOT EXISTS `virtual_domains` (
 `id` int(11) NOT NULL auto_increment,
 `name` varchar(50) NOT NULL,
 PRIMARY KEY (`id`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

USE mailserver;
CREATE TABLE IF NOT EXISTS `virtual_users` (
 `id` int(11) NOT NULL auto_increment,
 `domain_id` int(11) NOT NULL,
 `email` varchar(100) NOT NULL,
 `password` varchar(150) NOT NULL,
 PRIMARY KEY (`id`),
 UNIQUE KEY `email` (`email`),
 FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

USE mailserver;
CREATE TABLE IF NOT EXISTS `virtual_aliases` (
 `id` int(11) NOT NULL auto_increment,
 `domain_id` int(11) NOT NULL,
 `source` varchar(100) NOT NULL,
 `destination` varchar(100) NOT NULL,
 PRIMARY KEY (`id`),
 FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;


CREATE USER 'mailadmin'@'%' IDENTIFIED BY $("/run/secrets/mysql_mailadmin_passwd");
GRANT ALL PRIVILEGES ON `mailserver`.* TO 'mailadmin'@'%';

CREATE USER 'mailuser'@'%' IDENTIFIED BY $("/run/secrets/mysql_mailuser_passwd");
GRANT ALL PRIVILEGES ON `mailserver`.* TO 'mailuser'@'%';

FLUSH PRIVILEGES;

用户创建语句,放置在传递给入口点的script.sql文件中。该文件成功创建了数据库、表,但由于机密而导致用户失败。

我尝试在脚本中使用cat $("/run/secrets/mysql_mailadmin_passwd")

CREATE USER 'mailadmin'@'%' IDENTIFIED BY XXXXXXXXXXXXX ;
GRANT ALL PRIVILEGES ON `mailserver`.* TO 'mailadmin'@'%';

经过多次尝试,日志一直说我的 sql 语法有一个“错误”。

【问题讨论】:

  • 你能解释更多吗?你的码头工人长什么样?你的剧本是什么?
  • 确切的错误是什么?
  • cat /run/secrets/mysql_mailadmin_passwd 打印什么?
  • ERROR 1064 (42000) at line 33: 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在 '/run/secrets/mysql_mailadmin 附近使用正确的语法,并且秘密以明文形式传递:当我登录容器时,我可以从 shell 中捕获它并显示字符串

标签: mysql


【解决方案1】:

您可以使用与one described in here 类似的方法:

start.sh shell 脚本(由您的 docker 映像作为CMD 执行)中,您创建/完成您的引导 sql 脚本:

    cat >/tmp/bootstrap.sql <<EOF
...
SET PASSWORD FOR 'root'@'127.0.0.1' = PASSWORD('$MYSQL_ROOT_PASSWORD');
GRANT ALL PRIVILEGES ON *.* TO 'root'@'127.0.0.1' WITH GRANT OPTION;
CREATE USER IF NOT EXISTS 'root'@'localhost';
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('$MYSQL_ROOT_PASSWORD');
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION;
EOF
...

MYSQL_MODE_ARGS+=" --init-file=/tmp/bootstrap.sql"

在我们的例子中:

MYSQL_ROOT_PASSWORD=cat $("/run/secrets/mysql_mailadmin_passwd")

当然,这一切都假设你实际上是have created the secret beforehand

【讨论】:

  • 好的,我明白你的意思了。我对使用 docker-secrets 的过程比对环境变量更感兴趣。 2个用户不是root用户。使用 env 变量正确设置了 root 密码。对于其他人,我犹豫了很多,但我仍然不清楚在 shell 和 .sql 中注入 docker-secrets,应该有办法做到这一点
  • @user9276118 这个脚本是一个示例:为你的用户调整它。
  • @user9276118 入口点也可以工作,只要你启动一个类似于我描述的 start.sh 的脚本。
猜你喜欢
  • 1970-01-01
  • 2020-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-23
  • 2021-01-21
  • 2020-02-04
  • 2020-10-13
相关资源
最近更新 更多