mysql:使用 docker exec 时以交互方式询问密码

mysql:使用 docker exec 时以交互方式询问密码

通常你会运行 MySQL 客户端来导入这样的 SQL 文件:

mysql -uexample_user -p example_database < filename.sql

然后它会要求输入密码,输入正确的密码后,它会执行 中的 SQL 语句filename.sql。这种交互式密码提示降低了密码最终出现在 shell 历史记录中的风险。

当 MySQL 在 Docker 容器内运行时,可以假设您可以使用以下命令执行相同操作:

docker exec container_name mysql -uexample_user -p example_database < filename.sql

但事实并非如此。使用此命令时,MySQL 不会要求输入密码。

docker允许 MySQL 询问密码的正确命令是什么?

答案1

我做了一些测试,看来这样做是不可行的。

一般来说,你可以使用参数-it启动一个带有伪tty的交互式终端来获取密码提示mysql,但是这种参数组合不允许您将文件直接放入命令中。

要使用定向文件,您需要省略参数-t并仅使用-i。当然,在这种情况下,您需要直接在命令中指定密码。如果您不想让密码可见或记录,您可以使用变量来“隐藏”它。

docker exec -i container_name mysql -uexample_user \
  -p"$MYSQL_PASSWORD" example_database < filename.sql

这也是官方建议的方式MySQL Docker 镜像文档(参见从转储文件恢复数据在最后。

答案2

(我不熟悉docker,但是......)

不使用命令行将密码输入 mysql 的常规方法是使用包含密码的附加选项文件,并在调用 mysql 时引用此文件:

$ docker exec container_name \
cat /home/fred/pwd.cnf

[client]
username=example_user
password=MySqlPassword

$ docker exec container_name \
   mysql --defaults-file=/home/fred/pwd.cnf example_database < filename.sql

看:https://dev.mysql.com/doc/refman/8.0/en/password-security-user.html

我是假设您可以执行类似的操作,因为您正在读取的 SQL 文件也必须在容器“内”。

相关内容