“名称解析中的临时失败”:Symfony 5.3 使用 Doctrine 和 Docker 连接到 MariaDB

Posted

技术标签:

【中文标题】“名称解析中的临时失败”:Symfony 5.3 使用 Doctrine 和 Docker 连接到 MariaDB【英文标题】:"Temporary failure in name resolution": Symfony 5.3 Connection to MariaDB with Doctrine and Docker 【发布时间】:2021-09-03 20:35:18 【问题描述】:

我的开发环境在 docker(nginxphp 和 mariadb)中运行,并尝试在 symfony 中使用教义创建数据库。当我运行php bin/console doctrine:database:create 时,我会得到以下错误:

[critical] Error thrown while running command "doctrine:database:create". Message: "An exception occurred in driver: SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: Temporary failure in name resolution"

我在.env 中的配置如下:

DATABASE_URL="mysql://admin:symfony-admin@db/symfony_test?serverVersion=mariadb-10.1"

这是我的docker-compose.yml

version: "3.6"
services:
  web:
    image: nginx:latest
    ports:
      - "8080:80"
    volumes:
      - ./code:/code
      - ./site.conf:/etc/nginx/conf.d/site.conf
    depends_on:
      - php

  php:
    build: .
    volumes:
      - ./code:/code 
    links:
      - db

  db:
    image: mariadb:latest
    restart: always
    ports:
      - "33006:3306"
    volumes:
      - ./db:/docker-entrypoint-initdb.d/
    environment:
      MYSQL_ROOT_PASSWORD: 'symfony-root-pwd'
      MYSQL_DATABASE: 'symfony_db'
      MYSQL_USER: 'admin'
      MYSQL_PASSWORD: 'symfony-admin'

我也使用 adminer 来访问数据库,然后登录就可以了。

有人知道我为什么不能用学说创建数据库吗?

干杯,

迈克尔

解决方案:

我自己找到了解决方案。命令php bin/console doctrine:database:create 需要在 php docker 容器中运行,而不是在本地终端中运行。 所以首先是docker-compose exec php /bin/bash,然后是php bin/console doctrine:database:create

【问题讨论】:

【参考方案1】:

你可以添加

links:
      - db

php 服务配置并将您的 DATABASE_URL 更改为 DATABASE_URL="mysql://admin:symfony-admin@db/symfony_db?serverVersion=mariadb-X.X.X"

服务db 将暴露给php 服务,并且在php 容器中db 将成为db 服务的主机(链接)

【讨论】:

嗨马克西姆,我试过了,但不幸的是它不起作用。我根据您的建议编辑了我的帖子。我有什么问题吗?【参考方案2】:

通常,这个问题出在密码上。由于连接字符串是一个 URL,它对特殊字符进行编码,认为它是一个参数。

为了清楚起见,解决此问题需要以下两个步骤之一:

    密码的 URL 编码,以便您获得带引号(% 编码)的字符,例如在 .env.local 或 .env 中:

例如,将字符 # 替换为 %23(其编码版本)。

-DATABASE_URL=mysql://user:special#password@localhost:3306/db?serverVersion=8.0 +DATABASE_URL=mysql://user:special%23password@localhost:3306/db?serverVersion=8.0

    或从 config/packages/doctrine.yaml 中的教义.dbal.url 中删除 resolve:
doctrine:
    dbal:
         url: '%env(DATABASE_URL)%'

第一个适合我!

答案参考:Malformed parameter "url". Symfony 5 does not accept special characters. #35568

【讨论】:

以上是关于“名称解析中的临时失败”:Symfony 5.3 使用 Doctrine 和 Docker 连接到 MariaDB的主要内容,如果未能解决你的问题,请参考以下文章

symfony 5.3 连接微软 sql server mssql

无法使用 Encore 在 Symfony 5.3 上正确安装和使用引导程序

Symfony 5.3 新身份验证不保留我的身份验证

配置 Symfony 5.3 以使用专用的 MongoDB 数据库进行测试

使用 Symfony 5.3 检查 JWT (Firebase) 令牌

Symfony - Composer 更新 - 需要使用旧的依赖项(PHP 5.4 到 PHP 5.3)