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

3

我已经在Docker中运行了我的开发环境(nginx、php和mariadb),并尝试使用Doctrine在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访问数据库,登录可以正常工作。

有人知道为什么用Doctrine无法创建数据库吗?

谢谢,
Michael

解决方案:

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

2个回答

2
您可以添加:
links:
      - db

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

服务db将会被暴露给php服务,在php容器中,db将作为主机(链接)到db服务。


嗨,Maxim,我尝试了这个,但不幸的是它不起作用。我按照你的建议编辑了我的帖子。我做错了什么吗? - Michael

0

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

为了明确起见,解决这个问题需要以下两步之一:

  1. 对密码进行 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

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

第一个对我来说有效!

答案参考:参数“url”格式错误。Symfony 5不接受特殊字符。#35568


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