Symfony4 / Docker: SQLSTATE[HY000] [2002] Connection refused Symfony4和Docker:SQLSTATE [HY000] [2002]连接被拒绝

3

我在Symfony 4和数据库连接方面遇到了问题。我试图使用php bin/console make:migration进行迁移,但是遇到了连接被拒绝的错误。

In AbstractMySQLDriver.php line 113:

  An exception occurred in driver: SQLSTATE[HY000] [2002] Connection refused  


In PDOConnection.php line 50:

  SQLSTATE[HY000] [2002] Connection refused  


In PDOConnection.php line 46:

  SQLSTATE[HY000] [2002] Connection refused  

我的.env文件如下。

###> doctrine/doctrine-bundle ###
# Format described at http://docs.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/configuration.html#connecting-using-a-url
# For an SQLite database, use: "sqlite:///%kernel.project_dir%/var/data.db"
# Configure your db driver and server_version in config/packages/doctrine.yaml
DATABASE_URL=mysql://db_user:db_password@127.0.0.1:3306/db_name
DATABASE_USER=sf4user
DATABASE_PWD=sf4pwd
DATABASE_NAME=sf4
DATABASE_HOST=127.0.0.1
DATABASE_PORT=3306
###< doctrine/doctrine-bundle ###

这是我的packages/doctrine.yaml文件:

parameters:
    # Adds a fallback DATABASE_URL if the env var is not set.
    # This allows you to run cache:warmup even if your
    # environment variables are not available yet.
    # You should not need to change this value.
    env(DATABASE_URL): ''

    doctrine:
        dbal:
            # configure these for your database server
            driver: 'pdo_mysql'
            server_version: '5.7'
            charset: utf8mb4
            default_table_options:
                charset: utf8mb4
                collate: utf8mb4_unicode_ci

            host: '%env(DATABASE_HOST)%'
            user: '%env(DATABASE_USER)%'
            password: '%env(DATABASE_PWD)%'
            dbname: '%env(DATABASE_NAME)%'
            port: '%env(DATABASE_PORT)%'

            url: '%env(resolve:DATABASE_URL)%'
        orm:
            auto_generate_proxy_classes: '%kernel.debug%'
            naming_strategy: doctrine.orm.naming_strategy.underscore
            auto_mapping: true
            mappings:
                App:
                    is_bundle: false
                    type: annotation
                    dir: '%kernel.project_dir%/src/Entity'
                    prefix: 'App\Entity'
                    alias: App

我知道数据库URL是根据我在.env文件中设置的内容解析的,但我无法让它正常工作,每当我尝试调用处理数据库的控制台方法时,都会出现连接被拒绝的错误。

我使用docker-compose.yml文件构建了这个项目:

version: '3'
services:
    apache:
        build: .docker/apache
        container_name: sf4_apache
        ports:
          - 80:80
        volumes:
          - .docker/config/vhosts:/etc/apache2/sites-enabled
          - .:/home/wwwroot/sf4
        depends_on:
          - php

    mysql:
        image: mysql
        container_name: sf4_mysql
        volumes:
            - .docker/data/db:/var/lib/mysql
        command: ["--default-authentication-plugin=mysql_native_password"]
        ports:
            - "3306:3306"
        environment:
            MYSQL_ROOT_PASSWORD: root_pwd_test
            MYSQL_DATABASE: sf4
            MYSQL_USER: sf4user
            MYSQL_PASSWORD: sf4pwd

    php:
        build: .docker/php
        container_name: sf4_php
        volumes:
          - .:/home/wwwroot/sf4
        environment:
          - maildev_host=sf4_maildev
        depends_on:
          - maildev
          - mysql

    phpmyadmin:
        image: phpmyadmin/phpmyadmin
        container_name: sf4_phpmyadmin
        ports:
            - 8080:80
        links:
            - mysql
        environment:
            MYSQL_USERNAME: root
            MYSQL_ROOT_PASSWORD: root_pwd_test
            PMA_HOST: mysql

我可能错过了什么?


你确定你的服务器上安装了mysql吗?它是否在3306端口上监听?你有任何防火墙阻止连接吗?你确定你的用户名/密码是正确的吗? - ehymel
是的,所有这些都已经设置好了。我找到了一个解决方案(详见下一条回答)。谢谢。 - xefiji
1个回答

10

我通过以下方式解决了问题:

  • 降级到mysql 5.7
  • 从docker-compose.yml中删除命令: ["--default-authentication-plugin=mysql_native_password"]
  • 在.env文件中将凭据硬编码到DATABASE_URL中,并引用docker compose中的"mysql"(服务名称),而不是127.0.0.1
    • DATABASE_URL=mysql://sf4user:sf4password@mysql:3306/sf4

这个!使用服务名称而不是127.0.0.1对我有帮助。 - Jonathan Argentiero

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接