【问题标题】:Docker with Doctrine generate-proxiesDocker 与 Doctrine 生成代理
【发布时间】:2021-04-02 03:33:42
【问题描述】:

我正在尝试为带有 Doctrine 的应用程序创建一个 Docker 容器(使用 docker-compose),问题是:如果我只是运行该应用程序,它可以工作,但是当我在运行命令之前尝试使用该应用程序时./vendor/bin/doctrine orm:generate-proxies,我收到错误:

PHP Warning:  require(/tmp/__CG__DomainEntitiesAnyEntity.php): failed to open stream: No such file or directory in /var/www/html/vendor/doctrine/common/lib/Doctrine/Common/Proxy/AbstractProxyFactory.php on line 204
PHP Fatal error:  require(): Failed opening required '/tmp/__CG__DomainEntitiesAnyEntity.php' (include_path='.:/usr/local/lib/php') in /var/www/html/vendor/doctrine/common/lib/Doctrine/Common/Proxy/AbstractProxyFactory.php on line 204

好的,所以只需在docker-compose.yml上运行命令

version: '3'

services:
  apache_server:
    build: .
    working_dir: /var/www/html
    ports:
      - "80:80"
    volumes:
      - ./:/var/www/html
      - ../uploads:/var/www/uploads
      - ./.docker/apache2.conf:/etc/apache2/apache2.conf
      - ./.docker/000-default.conf:/etc/apache2/sites-avaliable/000-default.conf
      - ./.docker/php.ini:/etc/php/7.4/apache2/php.ini
    depends_on:
      - postgres_database
    command: sh -c "./vendor/bin/doctrine orm:generate-proxies"
    networks:
      - some-network

是的,它按预期工作并生成/tmp 文件夹的代理,但在命令运行和生成代理的提示之后,我收到消息exited with code 0。这是因为 Docker 在获取 状态码 0 后完成了容器执行。所以我又尝试了两件事:

  1. 给某物加尾巴:
    command: sh -c "./vendor/bin/doctrine orm:generate-proxies && tail -f /var/www/html/log.txt"

但是当我这样做时,服务器不再响应请求(http://localhost/)。

  1. 在运行命令前添加 tty:
    tty: true
    # restart: unless-stopped    <--- also tried this

也不起作用。有没有另一种方法可以解决这个问题,而不必每次都在容器内手动运行命令?

PS:我的 dockerfile 就是这个:

FROM php:7.4-apache

WORKDIR /var/www/html

RUN a2enmod rewrite
RUN a2enmod headers

RUN mkdir /var/www/uploads
RUN mkdir /var/www/uploads/foo-upload-folder
RUN mkdir /var/www/uploads/bar-upload-folder
RUN chmod 777 -R /var/www/uploads

RUN apt-get update \
    && apt-get install -y \
        libpq-dev \
        zlib1g-dev \
        libzip-dev \
        unzip \
    && docker-php-ext-install \
        pgsql \
        pdo \
        pdo_pgsql \
        zip

RUN service apache2 restart

【问题讨论】:

    标签: php docker apache doctrine-orm command


    【解决方案1】:

    问题原因

    command 的 Docker Compose 配置

        command: sh -c "./vendor/bin/doctrine orm:generate-proxies"
    

    in docker-compose.yml 会覆盖 Docker 映像中的 Cmd php:7.4-apache,这通常会启动 Apache 服务器,请参阅

    docker inspect php:7.4-apache
    

    或更具体

    docker inspect --format="{{ .Config.Cmd }}" php:7.4-apache
    

    给你

    [apache2-foreground]
    

    一般解决方案

    如果您想在 Docker 映像的原始命令之前运行命令,请使用 Entrypoint 并确保调用原始入口点,请参阅

    $ docker inspect --format="{{ .Config.Entrypoint }}" php:7.4-apache
    [docker-php-entrypoint]
    

    例如,而不是 command 定义

        entrypoint: sh -c "./vendor/bin/doctrine orm:generate-proxies && docker-php-entrypoint"
    

    解决方案

    但是,在您的情况下,我会像这样配置 Doctrine(请参阅 Advanced Doctrine Configuration

    $config = new Doctrine\ORM\Configuration;
    // ...
    if ($applicationMode == "development") {
        $config->setAutoGenerateProxyClasses(true);
    } else {
        $config->setAutoGenerateProxyClasses(false);
    }
    

    在开发过程中,您的代码更改(作为卷安装)和代理可能必须更新/生成。在生产中,您的代码不再更改(将代码复制到 Docker 映像)。因此,您应该在您的Dockerfile 中生成代理(在您复制源代码之后),例如

    FROM php:7.4-apache
    WORKDIR /var/www/html
    # ...
    Copy . /var/www/html
    RUN ./vendor/bin/doctrine orm:generate-proxies
    

    【讨论】:

      猜你喜欢
      • 2011-12-17
      • 1970-01-01
      • 2012-08-24
      • 2013-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多