【问题标题】:Docker MySQL 8 how to set --secure-file-privDocker MySQL 8 如何设置 --secure-file-priv
【发布时间】:2019-08-07 01:02:58
【问题描述】:

我想解决这个问题:

ERROR 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 时只设置一个环境变量或参数,而不是带上我自己的配置文件。

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

【问题讨论】:

    标签: mysql docker parameter-passing config


    【解决方案1】:

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

    secure-file-priv 可能的值是:空字符串、目录名或 NULL,如 privous 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 的组合启动设置,后者的设置优先。

    【讨论】:

    • 有什么办法可以让dir 传递给--secure-file-priv 作为MySQL 命令的工作目录,比如LOAD DATA INFILE '<path-to-file>' ...,这样就可以通过LOAD DATA INFILE './file.csv' ... 而不是LOAD DATA INFILE 'secure-file-priv-dir/file.csv' ... 执行这种方式?我尝试将该目录作为选项 -w "secure-file-priv-dir" 传递给 docker run,但这似乎没有任何效果。
    • 好吧,我不确定,但在测试了load data 之后,我发现它可以通过/var/lib/mysql 工作,所以在你做LOAD DATA INFILE './file.csv' 它实际上意味着/var/lib/mysql/file.csv 根据我测试过的内容
    • 所以理论上你可以将secure-file-priv-dir 的值设为/var/lib/mysql 但总的来说我不确定这是否可以正常使用
    • 很高兴知道,我最初想将文件放入/var/lib/mysql,但我决定最好有一个单独的目录供您使用并放入 csv 文件/删除它们,因为想要LOAD DATA INFILE 的用户不需要对mysql 存储数据库数据的目录的访问权限。 (/var/lib/mysql)。
    猜你喜欢
    • 2016-09-03
    • 1970-01-01
    • 1970-01-01
    • 2020-05-05
    相关资源
    最近更新 更多