Mysql Docker compose无法运行symfony数据库命令

Mysql Docker compose无法运行symfony数据库命令,mysql,docker,symfony,docker-compose,doctrine-orm,Mysql,Docker,Symfony,Docker Compose,Doctrine Orm,我正在使用docker compose和GitLab注册表开发一个symfony 5.1项目 我有一个用于数据库的mysql:5.7图像,用于服务器的nginx:stable和用于php的php:7.4-fpm 但当试图编译时,它不能运行bin/console原则:数据库:创建——如果不存在——没有交互因此它似乎无法连接到数据库。在创建数据库之前,Dockerfile上的所有内容似乎都正常工作 我收到的错误消息是: 步骤10/12:运行bin/控制台原则:数据库:创建——如果不存在——无交互;

我正在使用docker compose和GitLab注册表开发一个symfony 5.1项目

我有一个用于数据库的mysql:5.7图像,用于服务器的nginx:stable和用于php的php:7.4-fpm

但当试图编译时,它不能
运行bin/console原则:数据库:创建——如果不存在——没有交互因此它似乎无法连接到数据库。在创建数据库之前,Dockerfile上的所有内容似乎都正常工作

我收到的错误消息是:

步骤10/12:运行bin/控制台原则:数据库:创建——如果不存在——无交互; --->在8acb003982a3中运行

在AbstractMySQLDriver.php第93行中:

驱动程序SQLSTATE[HY000][2002]php_network_getaddresses:getaddrinfo中发生异常失败:名称或服务未知

在PDOConnection.php第31行中:

SQLSTATE[HY000][2002]php_network_getaddresses:getaddrinfo失败:名称或服务未知

在PDOConnection.php第27行中:

SQLSTATE[HY000][2002]php_network_getaddresses:getaddrinfo失败:名称或服务未知

在PDOConnection.php第27行中:

PDO::_构造():php_网络_getaddresses:getaddrinfo失败:名称或服务未知

原则:数据库:创建[-s |--shard shard][c |--connection[connection][--如果不存在的话][h |--help][q |--quiet][v | vv |--verbose][-v |--version][--ansi][--无ansi][--无交互][e |--env-env][--无调试][--]

错误:服务“php”无法生成:命令“/bin/sh-c bin/console原则:数据库:create——如果不存在——无交互;”返回了一个非零代码:1

我在symfony.env文件中硬编码了如下数据库数据:
database\u URL=mysql://root:root@mysql:/mydb?serverVersion=5.7

在config/packages/doctrine.yaml中

doctrine:
  dbal:
    driver: 'pdo_mysql'
    url: '%env(resolve:DATABASE_URL)%'
我的mysql Dockerfile非常简单,如mysql:5.7中的

My ngingx Dockerfile:

FROM nginx:stable
COPY ./src/www/ /usr/share/nginx/html/
COPY ./src/site.conf /etc/nginx/conf.d/default.conf
我的php Dockerfile是:

FROM php:7.4-fpm
RUN apt-get update \
  && apt-get install -y --no-install-recommends \
    curl \
    libpng-dev \
    libonig-dev \
    libicu-dev \
    libmemcached-dev \
    libz-dev \
    libpq-dev \
    libjpeg-dev \
    libfreetype6-dev \
    libssl-dev \
    libzip-dev \
    zip \
    unzip \
    libmcrypt-dev \
    libxml2-dev \
    libbz2-dev \
    libjpeg62-turbo-dev \
    git \
  && apt-get clean \
  && rm -rf /var/lib/apt/lists/*

RUN docker-php-ext-install mysqli pdo pdo_mysql intl mbstring exif pcntl bcmath gd

ENV COMPOSER_HOME /usr/share/nginx/html/.composer

RUN curl -sS https://getcomposer.org/installer | php -- \
    --install-dir=/usr/bin \
    --filename=composer

RUN mkdir -p $COMPOSER_HOME/cache

COPY ./src/www /usr/share/nginx/html
WORKDIR /usr/share/nginx/html/smartlink
RUN COMPOSER_MEMORY_LIMIT=-1 composer install --prefer-source --no-interaction
RUN bin/console doctrine:database:create --if-not-exists --no-interaction;
RUN bin/console doctrine:migrations:migrate --no-interaction;
RUN bin/console doctrine:schema:update --force --no-interaction;
docker compose文件是:

version: "3.7"

services:
  
  mysql:
    container_name: symfony_mysql
    build: 
      context: .
      dockerfile: ./infrastructure/docker/mysql/Dockerfile
    ports:
      - '33060:3306'
    environment:
      MYSQL_ROOT_PASSWORD: 'root'
      MYSQL_USER: 'user'
      MYSQL_PASSWORD: 'test'
    volumes:
      - ./src/mysql:/var/lib/mysql
    env_file:
      - ./infrastructure/environments/development.env
    networks:
      - code-network

  php:
    build: 
      context: .
      dockerfile: ./infrastructure/docker/php/Dockerfile
    tty: true
    volumes:
      - ./src/www:/usr/share/nginx/html
    env_file:
      - ./infrastructure/environments/development.env
    restart: always
    networks:
      - code-network
    depends_on: 
      - mysql

  http:
    build: 
      context: .
      dockerfile: ./infrastructure/docker/nginx/Dockerfile
    ports:
      - "8080:80"
    tty: true
    volumes:
      - ./src/www:/usr/share/nginx/html
      - ./src/site.conf:/etc/nginx/conf.d/default.conf
    env_file:
      - ./infrastructure/environments/development.env
    restart: always
    networks:
      - code-network
    depends_on:
      - php

networks:
  code-network:
    driver: bridge
在本地运行时,如果需要从终端运行symfony数据库命令,则需要将.env的硬编码数据库配置更改为
database\u URL=mysql://root:root@127.0.0.1:33060/mydb?serverVersion=5.7
,通过此配置,数据库命令从终端工作,但symfony不连接到数据库。对于其他配置,symfony连接到数据库,但终端命令不起作用

这就像三个容器没有共享symfony正确所在的文件夹一样

我已经阅读了很多关于使用这3个容器部署symfony的教程,我认为我正确地遵循了这些教程,但我无法使其正常工作,我没有看到任何错误或与这些教程不同的地方。需要一些关于这个错误的帮助吗

PD:我添加了conf nginx文件,它与我在教程中读到的相同,但我不确定它是否正确,因为每个教程使用的conf文件略有不同:

server {
    listen 80;
    # listen [::]:80 default_server ipv6only=on;

    # server_name localhost;
    root /usr/share/nginx/html/smartlink/public;
    # index index.php index.html index.htm;
    client_max_body_size 100m;

    location / {
        try_files $uri /index.php$is_args$args;
    }

    location ~ ^/index\.php(/|$) {
        fastcgi_pass php:9000;
        fastcgi_split_path_info ^(.+\.php)(/.*)$;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        fastcgi_param DOCUMENT_ROOT $realpath_root;
        internal;
    }

    location ~ \.php$ {
        return 404;
    }

    location ~ /\.(?:ht|git|svn) {
        deny all;
    }

    error_log  /var/log/nginx/smartlinkapp_error.log;
    access_log /var/log/nginx/smartlinkapp_access.log;
}

你只要做个决定就行了。当env文件中的主机定义为127.0.0.1时,您的web应用程序无法在容器内连接,这是绝对合乎逻辑的。您应该使用容器名称,在本例中仅使用“symfony_mysql”。您应该提供一个初始shell脚本,该脚本在容器内执行,这将使用例如bin/console原则:database:create、原则:fixtures:load等等来设置您的系统

当您使用composer并试图在主机和容器上执行一些命令时,您将遇到类似的效果。在这种情况下,您必须确保本地系统需求满足docker项目的需求。例如,任何重大php更新都可能破坏您当前的工作流程

因此,设置您的项目,使容器中的每个命令都能成功执行。使用“docker exec”访问您的容器并对其进行操作


此外,当容器内的网络连接正常工作时,您没有太多需要修改的内容来使用docker swarm或kubernetes部署项目。

在映像构建过程中,您不应该尝试与DB通信。在容器构建、安装和运行之后执行此操作。并在数据库URL中使用另一个服务名称作为主机名。@yivi我在数据库URL中使用另一个服务名称作为主机名,正如我在开始时所说的,将其更改为127.0.0.1只是在终端上执行数据库命令的一种变通方法。我在构建过程中添加了这些命令,以便在数据库中完成注册表映像。如果没有,当我部署注册表映像时,没有数据库,我会得到一个错误。此外,在这种情况下,这是不可能的,因为DB是一项服务,并且在映像构建期间服务没有启动。并且生成器未连接到compose网络。