我在 Windows 的 Docker 上安装了 MySQL 8,随后在 WSL 中用命令行连接数据库失败:

$ mysql -u root -h localhost -p
Enter password:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)

Windows 下的 PyCharm 是能正常连接 MySQL 的,所以肯定不是服务端的问题;我 Google 了也没有找到原因,所以猜测是 WSL 的锅。

但是最近在 GitHub Actions 上复现了这个问题。我在调用 GitHub Actions 为一个 Django Web 应用编写集成测试时在,这个问题再次发生了。

在搜索其他 Django + GitHub Actions + MySQL 相关网页并尝试后,我发现了问题所在:将 MYSQL_HOSTlocalhost 改为 127.0.0.1 即可!

$ mysql -u root -h 127.0.0.1 -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 17
Server version: 8.0.22 MySQL Community Server - GPL

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

我猜测原因是:使用 localhost 时,mysql 客户端并不是访问 localhost:3306,而是直接访问 /var/run/mysqld/mysqld.sock。如果是在本地部署 MySQL,这样当然没有问题;但是如果使用 Docker 部署 MySQL,/var/run/mysqld/mysqld.sock 根本不存在,必须通过 127.0.0.1:3306 进行访问。

而 PyCharm 使用 jdbc 就不会受到影响。

后来我在 Stack Overflow 的十几个回答中找到一个相关的回答 (opens new window),但也没有提到 Docker,只有回答的回复中才提到了 Docker。