Не удается запустить PHP ARTISAN OPTIMIZE в Dockerfile в Azure CI/CD

Вопрос или проблема

Я пытаюсь разработать решение для автоматического использования PHP ARTISAN CACHE в Dockerfile или YAML-стадии, не вызывая сбой в приложении.

Когда я добавляю его в Dockerfile, который использую для монтирования контейнера для развертывания, приложение выдает ошибку 500.

Но когда я использую его вручную в консоли Azure Container App, все работает нормально и все функционирует идеально…

Так как я пытаюсь автоматизировать все и сделать непрерывное развертывание, я не могу запускать это вручную при каждом развертывании.

Вот Dockerfile, который я использую:

FROM debian:latest

# Установка PHP, Apache и необходимых расширений
RUN apt-get update && \
  apt-get install php8.2 php8.2-cli php8.2-zip php8.2-mysql php8.2-bz2 php8.2-curl php8.2-mbstring php8.2-intl php8.2-bcmath php8.2-dom php8.2-gd php8.2-common apache2 libapache2-mod-php8.2 -y

# Включение модулей PHP и Apache
RUN a2enmod php8.2 rewrite

# Установка composer
RUN apt-get update && apt-get install -y curl
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

# Установка Node и NPM
RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash
ENV NVM_DIR /root/.nvm
RUN . "$NVM_DIR/nvm.sh"
ARG NODE_VERSION=21.0.0
RUN . "$NVM_DIR/nvm.sh" && \
    nvm install ${NODE_VERSION} && \
    nvm alias default ${NODE_VERSION} && \
    nvm use default
ENV NODE_PATH $NVM_DIR/versions/node/v${NODE_VERSION}/lib/node_modules
ENV PATH $NVM_DIR/versions/node/v${NODE_VERSION}/bin:$PATH

# Очистка кэша apt для уменьшения размера изображения
RUN apt-get clean && \
    rm -rf /var/lib/apt/lists/*

# Установка рабочего каталога
WORKDIR /var/www/html

# Копирование файлов конфигурации composer и npm
COPY composer.json composer.lock package.json package-lock.json ./

ENV COMPOSER_ALLOW_SUPERUSER=1

# Установка зависимостей composer и npm
RUN composer install --no-scripts --no-autoloader --no-dev && \
    npm install

# Копирование остальной части приложения
COPY . .

# Завершение настройки composer и запуск сборки npm
RUN composer dump-autoload --optimize && \
    npm run build

# Настройка пользовательской конфигурации apache и php
COPY docker/php-apache/000-default.conf /etc/apache2/sites-available/000-default.conf
COPY docker/php-apache/php.ini /etc/php/8.2/apache2/php.ini

# Запуск команд artisan (сначала очистка команд)
RUN php artisan optimize:clear && \
    php artisan icons:clear && \
    php artisan icons:cache

# Установка разрешений для Laravel
RUN chown -R www-data:www-data /var/www/html/storage /var/www/html/bootstrap/cache
RUN chmod -R 775 /var/www/html/storage /var/www/html/bootstrap/cache

# Открытие порта 80
EXPOSE 80

# Запуск Apache в переднем плане И SБОРКА NPM
CMD ["apache2ctl", "-D", "FOREGROUND"]

После некоторых подсказок я понял, что когда я запускаю команды artisan optimize или config в dockerfile, некоторые файлы имеют такие разрешения:

введите описание изображения здесь

Из-за этого приложение получает ошибку 500 и даже ничего не показывает.

А когда я вручную ввожу команду в консоли azure container apps, она работает нормально и с такими разрешениями:

введите описание изображения здесь

Теперь она использует root для выполнения php artisan optimize, но в пайплайне используется обычный www-data.

Я почти на 100% уверен, что это связано с разрешениями, но не могу понять, что именно.

Ответ или решение

Проблема, с которой вы столкнулись при автоматическом запуске команды php artisan optimize в вашем Dockerfile, скорее всего, связана с правами на файлы и тем, что команды Artisan, запускаемые во время сборки контейнера, выполняются от имени пользователя root. Это может привести к созданию файлов и папок с правами доступа, недоступными для пользователя www-data, под которым работает ваш веб-сервер.

Вот несколько шагов, которые могут помочь решить вашу проблему:

1. Используйте многослойный Dockerfile

Разделите ваш Dockerfile на несколько этапов. На первом этапе (билд-этап) вы можете выполнять установку зависимостей, а на втором этапе (релиз-этап) — копировать файлы и устанавливать правильные права.

Пример Dockerfile

# Билд-этап
FROM php:8.2-apache AS build

# Установите необходимые зависимости
RUN apt-get update && apt-get install -y \
    libzip-dev \
    libpng-dev \
    && docker-php-ext-install zip gd

# Установите Composer
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer

# Установите Node.js и NPM (ваш метод)
# ... ваш код установки Node.js и NPM ...

WORKDIR /var/www/html

# Копируйте ваши файлы
COPY composer.json composer.lock package.json package-lock.json ./

# Установите зависимости
RUN composer install --no-scripts --no-autoloader --no-dev
RUN npm install

# Копируйте весь код приложения
COPY . .

# Финишная настройка Composer
RUN composer dump-autoload --optimize
RUN npm run build

# Команды Artisan
RUN composer install --prefer-dist --no-plugins --no-scripts --no-dev
RUN php artisan optimize:clear && php artisan config:cache

# Релиз-этап
FROM php:8.2-apache

# Копируйте только необходимые файлы из билд-этапа
COPY --from=build /var/www/html /var/www/html

# Установите правильные права
RUN chown -R www-data:www-data /var/www/html/storage /var/www/html/bootstrap/cache && \
    chmod -R 775 /var/www/html/storage /var/www/html/bootstrap/cache

# Настройка Apache
COPY --from=build /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/000-default.conf

EXPOSE 80

CMD ["apache2-foreground"]

2. Убедитесь в правильных правах доступа

Проверьте, что после выполнения команды Artisan права на файлы и папки установлены корректно. В вашем случае это может потребовать ручной настройки прав после выполнения команд Artisan.

3. Используйте команды artisan в CI/CD

Если использование команд Artisan в Dockerfile не требуется для вашего рабочего процесса, рассмотрите возможность выполнения этих команд в этапе CI/CD вашего Azure Pipelines или GitHub Actions. Это может быть сделано, добавив шаги в ваш pipeline:

- script: |
    docker exec <your-container-name> php artisan optimize:clear
    docker exec <your-container-name> php artisan config:cache
  displayName: 'Run Artisan Commands'

4. Логи и отладка

Если возникает ошибка 500, проверьте логи приложения для выявления причины. Логи Laravel находятся в storage/logs/laravel.log. Вы также можете отладить права на файлы и убедиться, что они установлены правильно с помощью команды ls -la.

Заключение

Следуя приведенным рекомендациям и настоятельно рекомендуя использовать многослойный подход, у вас получится избежать проблем с правами доступа и обеспечит стабильную работу приложения после автоматизации развертывания с Docker и Azure CI/CD.

Оцените материал
Добавить комментарий

Капча загружается...