通常你会运行 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 文件也必须在容器“内”。