完整错误为Doctrine\DBAL\Exception\ConnectionException:驱动程序中发生异常:SQLSTATE[HY000] [2002]/app/vendor/doctrine/dbal/lib/Doctrine/中没有此类文件或目录DBAL/Driver/AbstractMySQLDriver.php 第 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
时,我都会收到错误不支持的服务配置选项:'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
登录并创建所需的用户和数据库,但我仍然在努力实际连接到它。
运行docker ps
确实显示sql容器正在运行btw;
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
我还认为,当我使用 Mac 时,对 parameters.yml
文件的更改可能无法与容器正确同步(在我以前的工作场所,我们必须使用 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
然后在php文件中使用database_host: db
。
我会诊断
- 检查 mysql 容器中的 docker 日志 => 没有错误
- 登录mysql容器并登录mysql =>没有错误
- 从主机登录 mysql(
mysql -u username -p
因为您映射到主机的 3306 端口) 确保 mysql.cnf 不会阻止来自外部的连接(检查 mysql 配置中的绑定(bind)地址如果是 127.0.0.1 则其唯一 允许在本地连接表单,我现在将其设为 0.0.0.0 或 评论该行(如果存在)
mysqld --verbose --help
=> 您将看到所有选项mysqld --verbose --help | mysqld --verbose --help | grep 绑定(bind)地址
=> 检查绑定(bind)地址
确保我尝试登录的用户有足够的权限 connect(
SELECT user,host FROM mysql.user;
) 检查您的用户是否可以 从 docker 网络连接 =>172.*
或任何地方 =>%
关于mysql - 交响乐; SQLSTATE[HY000] [2002] 使用 127.0.0.1 作为数据库主机时没有此类文件或目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56644412/