Mysql Docker compose无法运行symfony数据库命令
我正在使用docker compose和GitLab注册表开发一个symfony 5.1项目 我有一个用于数据库的mysql:5.7图像,用于服务器的nginx:stable和用于php的php:7.4-fpm 但当试图编译时,它不能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/控制台原则:数据库:创建——如果不存在——无交互;
运行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网络。