我在 Windows 的 Docker 上安装了 MySQL 8,随后在 WSL 中用命令行连接数据库失败:
1 | $ mysql -u root -h localhost -p |
Windows 下的 PyCharm 是能正常连接 MySQL 的,所以肯定不是服务端的问题;我 Google 了也没有找到原因,所以猜测是 WSL 的锅。
但是最近在 GitHub Actions 上复现了这个问题。我在调用 GitHub Actions 为一个 Django Web 应用编写集成测试时在,这个问题再次发生了。
在搜索其他 Django + GitHub Actions + MySQL 相关网页并尝试后,我发现了问题所在:将 MYSQL_HOST
从 localhost
改为 127.0.0.1
即可!
1 | $ mysql -u root -h 127.0.0.1 -p |
我猜测原因是:使用 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 的十几个回答中找到一个相关的回答,但也没有提到 Docker,只有回答的回复中才提到了 Docker。