完整的错误是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和一次与MySQL服务器的Mac。在这两种情况下,我都可以通过命令行和SequelPro/TablePlus进行连接,但是每当我试图通过浏览器访问网站时,我都会得到"No这类文件或目录“错误。
我也尝试过多种方法来设置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'
虽然它确实构建了mysql映像,但我似乎无法用SequelPro/TablePlus连接到它。我在容器上运行docker-inspect
以获得IP (172.17.0.3),但似乎无法访问它。我可以使用exec
登录到它中,使用mysql -u root
登录并创建所需的用户和数据库,但是我仍然很难真正连接到它。
运行docker 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来同步我们的dev环境和实际容器之间的同步更改),但是当使用exec
检查容器本身时,我可以看到parameters.yml
文件中的更改。
问题是否在于试图连接到在Docker容器之外运行的mysql服务器?我还是新来的码头工人,所以如果这是个错误,我不会感到惊讶。任何小费都很感激,因为我正处于死胡同。
发布于 2019-06-18 01:40:39
在我看来,您的停靠-撰写文件看上去不对,请尝试下面的停靠-撰写文件。我删除了链接,网络就容易多了。
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 -u username -p
,因为您正在映射到主机的3306端口)- `mysqld --verbose --help` => you will see all options
- `mysqld --verbose --help | grep bind-address`=> check the bind-address
SELECT user,host FROM mysql.user;
),检查您的用户是否可以从停靠网络=> 172.*
或anywhere=> %
连接。发布于 2019-06-18 01:38:08
我认为你的问题与你的parameters.yml
有关
parameters:
database_host: 127.0.0.1
当您运行撰写时,MySQL和PHP将在它们自己的容器中运行,这些容器将有自己的in :来自php
的127.0.0.1
或localhost
将无法连接到db
容器。这就像您在虚拟机A
和MySQL上部署了PHP到另一个虚拟机B
,但是您尝试使用localhost
从机器A
访问MySQL,在这里您应该指定机器B
IP或主机名。
使用Docker Compose,内部DNS将将服务名称解析为它的容器,因此您可以使用以下内容:
parameters:
# name of the service in compose should be resolved
database_host: db
当客户端试图读取通常出现在SQLSTATE[HY000] [2002] No such file or directory
容器中的MySQL套接字时,可能会导致错误/var/lib/mysql/mysql.sock
。
https://stackoverflow.com/questions/56644412
复制相似问题