В моем проекте 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
в порядке, но я все еще не могу найти корень проблемы!