Symfony на AWS EB - Невозможно записать в каталог кеша после очистки кеша
Я развертываю приложение Symfony 4.4 в AWS ElasticBeanstalk и заметил, что кеш не очищается после каждого развертывания.
Однако приложение работало нормально, исключение было сделано для устаревшего кеша.
Чтобы решить проблему с кешем, я добавил следующий файл:
/.ebextensions/deploy.config
container_commands:
01-clear-cache:
command: php bin/console cache:clear --no-warmup --env=prod
Кажется, это очищает кеш, но затем каким-то образом меняет разрешения, поэтому я получаю сообщение об ошибке при попытке доступа к приложению.
Неустранимая ошибка: Uncaught RuntimeException: невозможно записать в каталог кеша (/var/app/current/var/cache/prod)
Почему бег cache:clear
изменяет разрешения и есть ли способ избежать этого, или, по крайней мере, как разрешить впоследствии, то есть в том же / другом .ebextensions
файл?
2 ответа
Эти команды выполняются root
user, как указано в docs.
Указанные команды выполняются от имени пользователя root и обрабатываются в алфавитном порядке по имени. Команды контейнера запускаются из промежуточного каталога, где ваш исходный код извлекается перед развертыванием на сервере приложений. Любые изменения, которые вы вносите в исходный код в промежуточном каталоге с помощью команды контейнера, будут включены при развертывании источника в его окончательном расположении.
(Акцент мой).
При повторном создании кеша новые каталоги принадлежат root
, и ваш PHP-процесс не может писать туда, если это необходимо.
Выполните свою команду, чтобы она выполнялась под тем же пользователем, что и ваша среда выполнения PHP. Например, если он работает подwww-data
пользователь:
container_commands:
01-clear-cache:
command: sudo -u webapp php bin/console cache:clear --no-warmup --env=prod
При использовании Ansible вы можете просто использовать become: true
как механизм, чтобы стать пользователем root и become_user: xxx
стать желанным пользователем.
Пример:
---
# roles/app/tasks/main.yml
- name: Run composer install
become: true
become_user: ubuntu
composer:
command: install
working_dir: "{{ deploy_path }}"
Обратите внимание, что вам нужно определить переменную с именем deploy_path
.