mysql - 交响乐; SQLSTATE[HY000] [2002] 使用 127.0.0.1 作为数据库主机时没有此类文件或目录

标签 mysql macos symfony docker

完整错误为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_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时,我都会收到错误不支持的服务配置选项:'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/

相关文章:

macos - SVN 不存储密码和用户名

swift - OpenSSL - 主题在 OS X 应用程序中不以 '/' 开头

objective-c - 如何在 Mac 上获取当前设备

symfony - 如何在表单中列出实体

symfony - 使用 Symfony 4.1.3 声明服务时如何从 Autowiring 中排除域?

mysql - 使用触发器相互依赖的多个 sql 查询

php - 提取数据库信息并显示为 html 问题?

mysql - 获取一个月中每一天的值(value)

php - 从左到右插入记录到3列

symfony - 手动生成学说 slug