PHP-mysqli无法连接到在Docker中运行的MySQL 8.0.16

3

总结:

  • mysql-server 8.0.16 正在 Docker 容器中运行
  • php 7 + Apache2 + myslnd 5.0.12 + mysqld 5.6.22 正在 Docker 外部运行

在 PHP 中,mysqli 失败,如下:

mysqli_connect('127.0.0.1', 'test', 'test', 'test', 8016)

ERR: 2054 : The server requested authentication method unknown to the client

与此同时,mysql 可以从 容器外部 连接:
mysql  -P 8016 -h 127.0.0.1 -u test -ptest test

问题:如何让mysqli_connect正常工作?

详情:

这里是一些相关的GRANT条目。

mysql> select host, user, db, select_priv, grant_priv
                  from mysql.db where user='test';
+------------+------+------+-------------+------------+
| host       | user | db   | select_priv | grant_priv |
+------------+------+------+-------------+------------+
| 172.17.0.1 | test | test | Y           | N          |

mysql> select host, user, plugin, select_priv, grant_priv
                    from mysql.user where user='test';
+------------+------+-----------------------+-------------+------------+
| host       | user | plugin                | select_priv | grant_priv |
+------------+------+-----------------------+-------------+------------+
| 172.17.0.1 | test | mysql_native_password | N           | N          |

我在 Docker 镜像中找到了 /etc/my.cnf 文件,并将其启用。
default-authentication-plugin=mysql_native_password

那允许甚至是老旧的(5.6)mysql连接,代码如下:
mysql  -P 8016 -h 127.0.0.1 -u test -ptest test

是的,它回复了一个包含标题的标头。

Server version: 8.0.16 MySQL Community Server - GPL

看起来命令行mysql知道mysql_native_password,但是mysqlnd不知道。

更多版本信息:

PHP Version 7.0.33-0ubuntu0.16.04.6
Apache/2.4.18 (Ubuntu) 

phpinfo 显示以下关于 mysqlnd 的信息:

Version:         mysqlnd 5.0.12-dev - 20150407 - $Id: b5c5906d452ec590732a93b051f3827e02749b83 $
Loaded plugins:  mysqlnd,debug_trace,auth_plugin_mysql_native_password,auth_plugin_mysql_clear_password,auth_plugin_sha256_password
API Extensions:  mysqli,pdo_mysql 

#docker ps (显示端口映射):

CONTAINER ID        IMAGE                       COMMAND                  CREATED             STATUS                  PORTS                               NAMES
99193bedb36c        mysql/mysql-server:8.0.16   "/entrypoint.sh my..."   8 weeks ago         Up 12 hours (healthy)   33060/tcp, 0.0.0.0:8016->3306/tcp   o8016

PHP-CLI同样无法连接。

(是的,在适当的时间运行了FLUSH PRIVILEGES;。)


@LinPy - 谢谢,但我不认为它是相同的。请注意,我已经在授权表和my.cnf中拥有“mysql_native_password”。此外,mysqlnd 似乎 能够处理sha2(请参见phpinfo)。 - Rick James
你需要使用 default-authentication-plugin 重新构建容器。 - LinPy
@LinPy - 这不是重复的问题。ALTER(重复问题的答案1和3)已经完成。[mysqld]设置(答案2)也已完成。 - Rick James
1个回答

5

你已经尝试在my.cnf中设置default-authentication-plugin,也许尝试将其作为命令参数来实现?我在我的docker-compose.yml中尝试了类似的身份验证问题,但这种方法对我有效 - 我从未尝试过在my.cnf中设置它。

mysql:
    container_name: myapp-db
    image: mysql:8.0
    command: --default-authentication-plugin=mysql_native_password
    environment:
     (snip)

以下是从Docker MySQL文档页面中提取的command命令。


你是说GRANT和my.cnf中的设置不足以满足要求吗?这听起来像是一个bug。 - Rick James
我只是说出了对我有效的方法。官方的mysql docker镜像有一个启动脚本,而不是直接运行mysql - 我没有深入研究过是否存在某种机制,使其不读取my.cnf文件,抱歉。我尝试的第一件事起作用了,所以我转向了下一个问题... - vacri
我在 https://hub.docker.com/r/mysql/mysql-server 上没有看到它;你在看哪个页面? - Rick James
https://docs.docker.com/samples/library/mysql/ - 我很确定这就是那个页面。其中“command”方法作为示例配置项在其中,但是我的模糊记忆使得页面内容有些不同(尽管它肯定在docs.docker.com网站上)。 - vacri
很烦人的是,直接从Docker安装软件包无法正常工作。我创建了一个类似于你的组合脚本,并使其正常工作。谢谢。 - Rick James

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接