我在 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_HOST
从 localhost
改为 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。