【问题标题】:Database connection issue through docker containers通过 docker 容器的数据库连接问题
【发布时间】:2020-02-29 08:33:29
【问题描述】:

我已经通过 docker 搭建了 Symfony 和 MariaDB 的开发环境。

我在那里拍摄了 bitman/symfony 图像:

 https://hub.docker.com/r/bitnami/symfony

这是我的 docker-compose.yaml

version: '2'

services:
  myapp:
    image: 'bitnami/symfony:1'
    ports:
      - '8000:8000'
    volumes:
      - '.:/app'
    environment:
      - SYMFONY_PROJECT_NAME=backend
      - MARIADB_PORT_NUMBER=3306
      - MARIADB_USER=root
    container_name: symfony_container
    depends_on:
      - mariadb
  mariadb:
    image: 'bitnami/mariadb:10.3'
    ports:
      - '3306:3306'
  environment:
    - ALLOW_EMPTY_PASSWORD=yes
    - MARIADB_USER=root
  container_name: mariadb_container

.env 文件中的重要行

DATABASE_URL=mysql://root:@localhost:3306/

我的 doctrine.yaml 文件:

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

现在如果我运行 docker-compose up,两个容器都会启动并且我可以访问 Symfony。

但是,如果我尝试使用以下命令创建实体:

php bin/console make:entity

我收到以下四个错误:

An exception occurred in driver: SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: Temporary failure in name resolution

SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: Temporary failure in name resolution 

SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: Temporary failure in name resolution  

PDO::__construct(): php_network_getaddresses: getaddrinfo failed: Temporary failure in name resolution 

奇怪的是,我可以通过 dbeaver 访问 MariaDB 数据库而没有麻烦。 Symfony 容器似乎没有找到 MariaDB 容器。

我会准确地说我使用的是 symfony 5.0.4 版

如果有人知道这些错误来自哪里,我将不胜感激

【问题讨论】:

    标签: mysql docker symfony doctrine-orm mariadb


    【解决方案1】:

    DATABASE_URL=mysql://root:@localhost:3306/

    在 docker 上下文中,localhost 是当前运行的容器。由于这是从您的 symfony 容器中使用的,它会尝试在那里找到数据库。

    从您的docker-compose.yml 文件中,您的数据库服务被命名为mariadb,并且会从参与您的应用程序默认网络的容器中解析:

    DATABASE_URL=mysql://root:@mariadb:3306/
    

    注意:一旦连接修复,我怀疑您可能还有其他与数据库用户设置相关的问题需要解决。如果是这种情况,请仔细查看your db image configuration documentation

    【讨论】:

      【解决方案2】:

      我同意@Zeitounator 解决方案,但在我的主机中,如果我启动
      php bin/console doctrine:migration:migrate
      它返回一个错误:
      could not translate host name "mariadb" to address: Name or service not known 我通过添加我的 /etc/hosts 解决了:
      127.0.0.1 mariadb
      它适用于主机和容器

      【讨论】:

      • 如果您使用 docker(-compose) 进行开发,您应该在您的 php 容器中启动该命令。如果您有不同版本或配置的 php => docker-compose exec myapp php bin/console doctrine:migration:migrate,从您的 docker 控制器执行此操作可能会导致意外结果。在这种情况下,mariadb 容器将是已知的。
      猜你喜欢
      • 2022-11-11
      • 1970-01-01
      • 2021-02-03
      • 2017-03-19
      • 1970-01-01
      • 2023-04-02
      • 2019-03-07
      • 1970-01-01
      • 2021-09-15
      相关资源
      最近更新 更多