Symfony 6(Docker Compose部署)数据库连接报错:无法解析mariadb_db主机
我通过Docker Compose运行Symfony 6,在.env文件中配置了数据库连接地址:
DATABASE_URL="mysql://root:password@mariadb_db:3306/jwt-auth-app?serverVersion=mariadb-10.5.8"
容器外的数据库客户端可以正常连接数据库,所有容器服务也运行正常,但用Postman请求接口时出现以下错误:
An exception occurred in the driver: SQLSTATE[HY000] [2002]
php_network_getaddresses: getaddrinfo for mariadb_db failed: No such
host is known.
我的security.yaml配置如下:
# config/packages/security.yaml security: enable_authenticator_manager: true # 用户密码哈希配置 password_hashers: Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface: 'auto' # 用户提供者配置 providers: app_user_provider: entity: class: App\Entity\User property: email firewalls: dev: pattern: ^/(_(profiler|wdt)|css|images|js)/ security: false login: pattern: ^/api/login stateless: true json_login: check_path: /api/login success_handler: lexik_jwt_authentication.handler.authentication_success failure_handler: lexik_jwt_authentication.handler.authentication_failure api: pattern: ^/api stateless: true entry_point: jwt jwt: ~ main: lazy: true provider: app_user_provider # 访问控制规则 access_control: - { path: ^/api/users, roles: IS_AUTHENTICATED_FULLY } - { path: ^/api/login, roles: PUBLIC_ACCESS }
错误原因及解决步骤
1. 检查Docker Compose网络配置
这个错误的核心是Symfony容器无法解析mariadb_db主机名,大概率是因为两个容器不在同一个Docker网络中。确保你的docker-compose.yml里Symfony服务和MariaDB服务加入了同一个自定义网络:
version: '3.8' services: symfony_app: # 你的Symfony服务名称 build: . ports: - "8000:80" networks: - app_network depends_on: - mariadb_db # 依赖MariaDB服务,确保启动顺序 mariadb_db: image: mariadb:10.5.8 environment: MYSQL_ROOT_PASSWORD: password MYSQL_DATABASE: jwt-auth-app ports: - "3306:3306" networks: - app_network networks: app_network: driver: bridge
Docker自定义网络内的容器可以通过服务名直接通信,默认桥接网络可能不支持服务名解析,所以必须用自定义网络。
2. 验证容器内的DATABASE_URL配置
进入Symfony容器,检查环境变量是否正确加载:
# 替换成你的Symfony容器名称 docker exec -it <symfony-container-name> /bin/bash # 查看DATABASE_URL echo $DATABASE_URL
如果输出和本地.env文件不一致,说明容器没有正确挂载.env文件,或者Docker Compose的environment字段覆盖了该配置。确保docker-compose.yml里Symfony服务挂载了.env:
symfony_app: # ...其他配置 volumes: - .:/var/www/html # 挂载项目目录,确保.env被包含
3. 确认MariaDB服务名称匹配
确保docker-compose.yml里MariaDB的服务名完全等于DATABASE_URL中的主机名(mariadb_db),Docker服务名大小写敏感,不能有拼写错误。
4. 清除Symfony缓存
容器内的缓存可能保留了旧的连接配置,执行缓存清除命令:
# 开发环境 php bin/console cache:clear # 生产环境 php bin/console cache:clear --env=prod
内容的提问来源于stack exchange,提问作者user3574492

