Не удается установить LiipImagineBundle 2.3 на Symfony 4.4 с Docker в рабочей среде

В моем проекте Dockerized Symfony 4.4 я могу переключаться между средами разработки и производства с помощью двух команд: make up-dev и make up-prod (используя Makefile)

В режиме разработки внутри контейнера я могу без проблем установить LiipImagineBundle, а затем, когда я переключаюсь в рабочую среду, make up-prod выходит с этим сообщением об ошибке:

Generated optimized autoload files containing 7171 classes
+ APP_ENV=prod composer run-script --no-dev post-install-cmd

Run composer recipes at any time to see the status of your Symfony recipes.

Executing script cache:clear [KO]
 [KO]
Script cache:clear returned with error code 1
!!  
!!   // Clearing the cache for the prod environment with debug                      
!!   // false                                                                       
!!  
!!  
!!  In EnvVarProcessor.php line 171:
!!                                                   
!!    Environment variable not found: "APP_SECRET".  
!!                                                   
!!  
!!  cache:clear [--no-warmup] [--no-optional-warmers] [-h|--help] [-q|--quiet] [-v|vv|vvv|--verbose] [-V|--version] [--ansi] [--no-ansi] [-n|--no-interaction] [-e|--env ENV] [--no-debug] [--] <command>
!!  
!!  
Script @auto-scripts was called via post-install-cmd
ERROR: Service 'app' failed to build: The command '/bin/sh -c set -eux;     mkdir -p var/cache var/log;     chmod +x bin/console;     composer dump-autoload --no-dev --no-scripts --optimize;     APP_ENV=prod composer run-script --no-dev post-install-cmd' returned a non-zero code: 1
make: *** [Makefile:26: up] Error 1

Это мой Dockerfile:

##
#  Base
##

FROM debian:9-slim as base

ENV TERM="xterm" \
    DEBIAN_FRONTEND="noninteractive" \
    TIMEZONE="Europe/Paris" \
    COMPOSER_ALLOW_SUPERUSER=1 \
    NODE_VERSION=8.12.0 \
    PHP_VERSION=7.2

# System depdendencies
RUN apt-get update --quiet && \
    apt-get install --quiet --no-install-recommends --yes \
        apt-transport-https \
        ca-certificates \
        lsb-release \
        wget && \
    wget -O /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg && \
    echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" >> /etc/apt/sources.list.d/php.list && \
    apt-get update --quiet && \
    apt-get install --quiet --no-install-recommends --yes \
        curl \
        git \
        nginx \
        php${PHP_VERSION} \
        php${PHP_VERSION}-apcu \
        php${PHP_VERSION}-curl \
        php${PHP_VERSION}-dom \
        php${PHP_VERSION}-fpm \
        php${PHP_VERSION}-gd \
        php${PHP_VERSION}-iconv \
        php${PHP_VERSION}-intl \
        php${PHP_VERSION}-mbstring \
        php${PHP_VERSION}-mysql \
        php${PHP_VERSION}-opcache \
        php${PHP_VERSION}-pdo \
        php${PHP_VERSION}-uuid \
        php${PHP_VERSION}-xml \
        php${PHP_VERSION}-simplexml \
        php${PHP_VERSION}-zip \
        supervisor \
        p7zip-full \
        tzdata \
        unzip \
        libxml2-dev \
        php${PHP_VERSION}-soap \
        vim && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* && \
    mkdir /run/php && \
    cp /usr/share/zoneinfo/${TIMEZONE} /etc/localtime && \
    echo "${TIMEZONE}" > /etc/timezone

# Composer

RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer && \
    composer global require "hirak/prestissimo:^0.3" --prefer-dist --no-progress --no-suggest --classmap-authoritative && \
    composer clear-cache

# Yarn

RUN curl -L -o /tmp/nodejs.tar.gz https://nodejs.org/dist/v${NODE_VERSION}/node-v${NODE_VERSION}-linux-x64.tar.gz && \
    tar xfvz /tmp/nodejs.tar.gz -C /usr/local --strip-components=1 && \
    rm -f /tmp/nodejs.tar.gz && \
    npm install yarn -g

COPY .docker/php.ini /etc/php/${PHP_VERSION}/cli/conf.d/50-setting.ini
COPY .docker/php.ini /etc/php/${PHP_VERSION}/fpm/conf.d/50-setting.ini
COPY .docker/pool.conf /etc/php/${PHP_VERSION}/fpm/pool.d/www.conf
COPY .docker/nginx.conf /etc/nginx/nginx.conf
COPY .docker/supervisord.conf /etc/supervisor/conf.d/supervisord.conf

EXPOSE 80

CMD ["supervisord", "-c", "/etc/supervisor/conf.d/supervisord.conf"]

WORKDIR /app

##
#  Production
##

FROM base as prod

# PHP dependencies
COPY composer.json composer.lock symfony.lock ./
RUN set -eux; \
    composer install --no-dev --no-autoloader --no-scripts --no-progress --no-suggest

COPY bin bin/
COPY config config/
COPY public public/
COPY src src/
COPY templates templates/
COPY translations translations/
COPY resources resources/
RUN set -eux; \
    mkdir -p var/cache var/log; \
    chmod +x bin/console; \
    composer dump-autoload --no-dev --no-scripts --optimize; \
    APP_ENV=prod composer run-script --no-dev post-install-cmd

# Assets dependencies
COPY assets/ ./assets
COPY package.json yarn.lock webpack.config.js ./
RUN set -eux; \
    mkdir -p public/build; \
    yarn install --no-progress;  \
    yarn encore production

RUN usermod -u 1000 www-data

А это Makefile:

EXEC := docker-compose exec app
PHP := $(EXEC) php -d memory_limit=-1
CONSOLE := $(PHP) bin/console

##
# Service
##

.PHONY: up-dev up-prod up down

up-dev: export ENV := dev
up-dev: up vendor public/build
    $(CONSOLE) cache:clear
ifeq ($(shell uname), Linux)
    $(EXEC) chown -R $(shell id -u):$(shell id -g) .
endif

up-prod: export ENV := prod
up-prod: up

up-beta: export ENV := beta
up-beta: up

up:
    docker-compose -f docker-compose.yml -f docker-compose.$(ENV).yml up -d --build --remove-orphans

Я думаю, что FROM base as prod является источником проблемы, но не могу понять, как это исправить, и не хочу изменять этот раздел, так как я взял проект на ходу.

Я уверен, что источником проблемы является LiipImagine, потому что до его установки make up-prod работало нормально!

ОБНОВЛЕНИЕ №1

Я пробовал два обновления:

Первый: я удалил это:

 RUN set -eux; \
     mkdir -p var/cache var/log; \
     chmod +x bin/console; \
     composer dump-autoload --no-dev --no-scripts --optimize; \
     APP_ENV=prod composer run-script --no-dev post-install-cmd

Второй: я добавил APP_SECRET вот так

 RUN set -eux; \
...
     APP_ENV=prod APP_SECRET=sameValueAsDotEnv composer run-script --no-dev post-install-cmd

В обоих случаях make up-prod работает нормально без ошибок, но мне нужно запустить composer install внутри контейнера, иначе пропадают зависимости... Я действительно не понимаю :(

ОБНОВЛЕНИЕ №2

Основываясь на 1-й части обновления № 1, я добавил это в раздел вверх Makefile:

$(EXEC) composer install --no-interaction

Теперь make up-prod в порядке, но я все еще не могу найти корень проблемы!


person Sami    schedule 27.11.2020    source источник


Ответы (2)


Я вижу ошибку:

Не найдена переменная среды: APP_SECRET.

Прежде всего, убедитесь, что ваши файлы .env и .env.loc содержат эту переменную. Я предполагаю, что в режиме DEV APP_SECRET устанавливается случайным образом, но в PROD его нужно указать явно.

Во-вторых, обратите внимание, что зависимости установки DEV и PROD немного отличаются:

if [ "$APP_ENV" = 'prod' ]; then
    composer install --prefer-dist --no-dev --no-progress --no-suggest --optimize-autoloader --classmap-authoritative --no-interaction
else
    composer install --prefer-dist --no-progress --no-suggest --no-interaction
fi

Надеюсь, это даст вам правильное направление.

person Max Kuznetsov    schedule 28.11.2020
comment
В файле .env prod есть переменная APP_SECRET! О зависимостях композитора я не вижу разницы, которая может объяснить проблему - person Sami; 29.11.2020

Ну, это работает после того, как я добавил APP_SECRET вот так

 RUN set -eux; \
...
     APP_ENV=prod APP_SECRET=123 composer run-script --no-dev post-install-cmd

Внутри контейнера переменная env APP_SECRET содержит значение, определенное в файле .env, а не 123 ! Я действительно не понимаю, почему я должен добавлять APP_SECRET перед composer!

person Sami    schedule 07.12.2020