首页 > 解决方案 > 交响乐;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_hostlocalhost来解决这个问题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 还是很陌生,所以如果这是错误的,我不会感到惊讶。感谢任何提示,因为我处于死胡同。

标签: mysqlmacossymfonydocker

解决方案


您的 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.*或任何地方连接=>%


推荐阅读