Docker MySQL 8如何设置--secure-file-priv

时间:2019-03-15 22:06:35

标签: mysql docker parameter-passing config

我想解决这个问题:

  

错误1290(HY000):MySQL服务器正在使用--secure-file-priv选项运行,因此它无法执行此语句

带有docker上的official MySQL 8图片。

命令:

SHOW VARIABLES LIKE "secure_file_priv";

给予:

+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| secure_file_priv | NULL  |
+------------------+-------+
1 row in set (0.01 sec)

是否可以通过使用官方的MySQL 8 Docker映像覆盖--secure-file-priv的默认值NULL?

此图像中的默认值设置为NULL config/my.cnf

完全我想在使用docker run或create时设置一个环境变量或参数,而不是自带配置文件。

但是如果这不可能,那么如何使用自定义配置文件? 自定义文件是否有可能会覆盖此一个参数,而其他参数仍保留在官方映像配置中?

1 个答案:

答案 0 :(得分:1)

根据this documentation,您可以通过传递secure-file-priv来通过命令行配置--secure-file-priv=dir_name

secure-file-priv-priv可能的值为:空字符串,目录名或NULL,如私有URL中所述。

来自mysql-docker page

  

没有cnf文件的配置:许多配置选项可以作为标志传递给mysqld。这将使您可以灵活地自定义容器,而无需cnf文件。例如,如果要更改所有表的默认编码和排序规则以使用UTF-8(utf8mb4),则运行以下命令:

$ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

所以在我们的情况下是这样的:

  

dir_name 应该是容器内的目录,否则会出现以下错误:mysqld: Error on realpath() on 'dir_name' (Error 2 - No such file or directory)

$ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag --secure-file-priv=dir_name

现在我们的更改已在MySQL中提交

mysql> SHOW VARIABLES LIKE "secure_file_priv";
+------------------+----------+
| Variable_name    | Value    |
+------------------+----------+
| secure_file_priv | dir_name |
+------------------+----------+

或者,您可以使用自定义配置文件,如此处所述:

  

使用自定义的MySQL配置文件:MySQL的默认配置可以在/etc/mysql/my.cnf中找到,该文件可能包含附加目录,例如/ etc / mysql / conf。 d或/etc/mysql/mysql.conf.d。请检查mysql映像本身中的相关文件和目录,以获取更多详细信息。

     

如果/my/custom/config-file.cnf是自定义配置文件的路径和名称,则可以像这样启动mysql容器(请注意,此命令仅使用自定义配置文件的目录路径):

$ docker run --name some-mysql -v /my/custom:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag

这将启动一个新容器some-mysql,其中MySQL实例使用/etc/mysql/my.cnf/etc/mysql/conf.d/config-file.cnf的组合启动设置,其中后者的设置优先。