mysql - 交响乐;SQLSTATE[HY000] [2002] 使用 127.0.0.1 作为 database_host 时没有这样的文件或目录
问题描述
完整的错误是Doctrine\DBAL\Exception\ConnectionException: An exception occurred in driver: SQLSTATE[HY000] [2002] No such file or directory in /app/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/AbstractMySQLDriver.php on line 113
,但这对于标题来说太长了。
我正在尝试在本地建立一个 Symfony 项目,但我很难让数据库连接正常工作。我的parameters.yml
样子如下
parameters:
database_host: 127.0.0.1
database_port: 3306
database_name: database_name
database_user: username
database_password: password
我一直在谷歌上搜索这个问题,大多数人似乎通过从更改database_host
为localhost
来解决这个问题127.0.0.1
,但这对我不起作用。该应用程序本身通过 Docker 运行,但我已经通过 Brew 设置了一次数据库连接,并通过用于 Mac 的 MySQL 服务器设置了一次。在这两种情况下,我都可以通过命令行和 SequelPro/TablePlus 进行连接,但是每当我尝试通过浏览器访问网站时,我都会收到“没有这样的文件或目录”错误。
我还尝试了多种设置 Docker MySQL 容器的方法,但无法使其正常工作。我的docker-compose.yml
样子是这样的;
nginx:
build: nginx
ports:
- "8080:80"
links:
- php
volumes:
- ../:/app
php:
build: php-fpm
volumes:
- ../:/app
working_dir: /app
extra_hosts:
- "site.dev: 172.17.0.1"
services:
db:
image: mysql:5.7
restart: always
environment:
MYSQL_DATABASE: 'database_name'
MYSQL_USER: 'username'
MYSQL_PASSWORD: 'password'
MYSQL_ROOT_PASSWORD: 'password_root'
ports:
- '3306:3306'
expose:
- '3306'
volumes:
- my-db:/var/lib/mysql
但是每当我运行时,docker-compose up -d
我都会收到错误消息Unsupported config option for services: 'db'
。
另一种尝试是添加
mysql:
image: mysql:latest
volumes:
- mysql_data:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD='password'
- MYSQL_DATABASE='database_name'
- MYSQL_USER='username'
- MYSQL_PASSWORD='password'
到 docker-compose 文件,虽然它确实构建了 mysql 映像,但我似乎无法使用 SequelPro/TablePlus 连接到它。我docker-inspect
在容器上运行以获取 IP(172.17.0.3),但似乎无法访问它。我可以exec
进入它,使用登录mysql -u root
并创建所需的用户和数据库,但是我仍然在努力实际连接到它。
Runningdocker ps
确实显示了运行 btw 的 sql 容器;
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b6de6030791d docker_nginx "nginx -g 'daemon of…" 19 minutes ago Up 14 minutes 0.0.0.0:8080->80/tcp docker_nginx_1
f26b832bb005 docker_php "docker-php-entrypoi…" 19 minutes ago Up 14 minutes 9000/tcp docker_php_1
6c2a9e657435 mysql:latest "docker-entrypoint.s…" 19 minutes ago Up 14 minutes 3306/tcp, 33060/tcp docker_mysql_1
parameters.yml
我还认为当我使用 Mac 时,文件更改无法与容器正确同步可能是一个问题(在我的旧工作场所,我们不得不使用 docker-sync 在我们的开发环境和实际容器之间进行同步更改) ,但是当使用检查容器本身时,exec
我可以看到parameters.yml
文件中的更改。
问题可能是它试图连接到在 Docker 容器外运行的 mysql 服务器吗?我对 Docker 还是很陌生,所以如果这是错误的,我不会感到惊讶。感谢任何提示,因为我处于死胡同。
解决方案
您的 docker-compose 文件对我来说看起来不对,请在 docker-compose 文件下方尝试。我删除了链接,网络更容易了。
version: '3'
services:
nginx:
build: nginx
ports:
- "8080:80"
networks:
- backend
volumes:
- ../:/app
php:
build: php-fpm
volumes:
- ../:/app
working_dir: /app
networks:
- backend
extra_hosts:
- "site.dev: 172.17.0.1"
db:
image: mysql:5.7
restart: always
environment:
MYSQL_DATABASE: 'database_name'
MYSQL_USER: 'username'
MYSQL_PASSWORD: 'password'
MYSQL_ROOT_PASSWORD: 'password_root'
networks:
- backend
ports:
- '3306:3306'
volumes:
- ./my-db:/var/lib/mysql
networks:
backend:
driver: bridge
然后database_host: db
在php文件中使用。我会诊断
- 检查 mysql 容器中的 docker 日志 => 没有错误
- 登录到mysql容器并登录到mysql =>没有错误
- 从主机登录mysql(
mysql -u username -p
因为您映射到主机的3306端口) 确保 mysql.cnf 不会阻止来自外部的连接(检查 mysql 配置中的绑定地址,如果它 127.0.0.1 是它唯一允许在本地连接的形式,我现在将其设为 0.0.0.0 或注释该行(如果存在) )
mysqld --verbose --help
=> 你会看到所有的选项mysqld --verbose --help | grep bind-address
=> 检查绑定地址
确保我尝试登录的用户有足够的权限来连接(
SELECT user,host FROM mysql.user;
)检查您的用户可以从 docker 网络 =>172.*
或任何地方连接=>%
推荐阅读
- java - ansible - 如何根据 ansible_facts 定义 var 的值
- ios - Child 的 ViewModel 的计算属性不会更新 @ObservedObject Parent 的 ViewModel
- r - 多时间序列预测(GAM 模型)
- kotlin - KSP中的“符号”是什么意思
- python - GET 请求只接受 1 个输入
- python - 表达式或函数作为 Range 函数的参数
- linux - 如何计算父目录的特定子目录中的文件?
- c++ - SFML 混合模式用 alpha 插入颜色
- c++ - 错误:“默认”不是“ns3::YansWifiPhyHelper”的成员
- android - 使用 android API 查找应用架构