Вопрос или проблема
Я пытаюсь разработать решение для автоматического использования 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.