Развертывание приложения Symfony2 для AWAS Elastic Beanstalk - Очистка кэша развертывания после развертывания
При развертывании приложения Symfony2 на Elastic Beanstalk мне нужно очистить ручной кеш, чтобы приложение начало работать. Итак, я добавил команду контейнера для очистки кэша prod во время развертывания. Команда запускается, но мне все равно пришлось вручную очистить, чтобы приложение работало.
После некоторого копания я обнаружил, что в файлах самого Symfony2 есть абсолютные строки пути. Добавленная мной команда запускает "предварительное развертывание" или до того, как файлы приложений будут перемещены из их промежуточной папки (называемой "/var/app/ondeck" ) в их конечное место отдыха ( "/var/app/current" ). В результате абсолютные строки пути в файлах кеша ошибочны, и приложение не загружается.
Кроме того, среда dev отлично работает сразу, потому что она автоматически восстанавливает свой собственный кеш. Единственное, на что это повлияло, - это среда prod.
Мой вопрос (ы):
- Есть ли способ запустить команду очистки кэша автоматически ПОСЛЕ того, как код был перемещен на место?
- Альтернативно, есть ли способ заставить Symfony2 указать другой "базовый путь" для генерации кэша? Таким образом, он может быть настроен так, чтобы указывать на правильное конечное местоположение.
Спасибо всем заранее: -)
Ответы
Ответ 1
Проблема возникает из-за того, что кеш заполняется в среде ondeck, когда различные команды Symfony запускаются в конце процесса установки композитора и/или ваши собственные команды (например, assetic: dump).
Решение состоит в том, чтобы очистить кеш в качестве последней команды развертывания и указать --no-warmup, чтобы остановить Symfony, автоматически заправляя его, так что кеш пуст, когда среда перемещается из ondeck в текущий. В моем .ebextensions/symfony.config у меня есть:
container_commands:
01_migrate:
command: php app/console doctrine:migrations:migrate --env=prod --no-debug --no-interaction
leader_only: true
02_dumpassets:
command: php app/console assetic:dump --env=prod --no-debug
99_clearcache:
command: php app/console cache:clear --env=prod --no-debug --no-warmup
Это не очень хорошо документировано, но вы также можете использовать крюк после развертывания для нагрева кеша после того, как среда была перенесена в текущий. Также в .ebextensions/symfony.config:
files:
"/opt/elasticbeanstalk/hooks/appdeploy/post/01-cachewarm.sh":
mode: "000755"
owner: root
group: root
content: |
#!/usr/bin/env bash
. /opt/elasticbeanstalk/support/envvars
cd $EB_CONFIG_APP_CURRENT
php app/console cache:warmup --env=prod --no-debug
Ответ 2
Эта проблема исправлена в последних дистрибутивах Symfony
2.3.23, 2.5.8, 2.6.1 и предстоящие версии (2.7., 3.,...)
См. https://github.com/heroku/heroku-buildpack-php/issues/64
Symfony теперь будет использовать ссылки по сравнению с FILE в контейнере, поэтому вам больше не нужно использовать хакерство post deploy.
Обратите внимание, что вам все равно нужно устанавливать активы как жесткие ссылки.
Ответ 3
Я потратил немного времени, пытаясь заставить вещи работать многоразовым способом, вот файл ebextensions, который мы завершили.
files:
"/tmp/parameters.yml":
mode: "000444"
content: |
parameters:
database_driver: pdo_mysql
database_host: '...'
database_port: null
database_name: ...
database_user: ...
database_password: ...
mailer_transport: smtp
mailer_host: 127.0.0.1
mailer_user: null
mailer_password: null
locale: en
secret: ...
option_settings:
- namespace: aws:elasticbeanstalk:hostmanager
option_name: LogPublicationControl
value: true
- namespace: aws:elasticbeanstalk:container:php:phpini
option_name: document_root
value: /web
- namespace: aws:autoscaling:launchconfiguration # This is for permission to the RDS instance
option_name: SecurityGroups
value: ...
container_commands:
01-params:
command: cp /tmp/parameters.yml app/config/parameters.yml
02-params:
command: chown webapp:webapp app/config/parameters.yml
03-bootsrap:
command: php vendor/sensio/distribution-bundle/Sensio/Bundle/DistributionBundle/Resources/bin/build_bootstrap.php
04-bootsrap:
command: chown webapp:webapp app/bootstrap.php.cache
05-cache:
command: php app/console cache:clear --env=prod --no-debug --no-warmup
06-cache:
command: chmod -R 0777 app/cache
07-logs:
command: chmod -R 0777 app/logs
08-cache:
command: chown -R webapp:webapp app/cache
09-logs:
command: chown -R webapp:webapp app/logs
Ответ 4
У меня была та же проблема, и я нашел решение на этой странице
и мой последний код - я использую Symfony Framework (v2.8):
commands:
01_create_post_dir:
command: "mkdir /opt/elasticbeanstalk/hooks/appdeploy/post"
ignoreErrors: true
files:
"/opt/elasticbeanstalk/hooks/appdeploy/post/initial_cron_job.sh":
mode: "000755"
owner: root
group: root
content: |
#!/usr/bin/env bash
# This line was very important for me as I needed to get EnvVars
. /opt/elasticbeanstalk/support/envvars
rm -rf /var/app/current/app/cache/* /var/app/current/app/logs/*
chmod -R 777 /var/app/current/app/cache
chmod -R 777 /var/app/current/app/logs
su -c "command_name" $EB_CONFIG_APP_USER
Слово объяснения:
- Мне не нужно разогревать кеш, поэтому я делаю rm -rf в папках кеша и журналов
- Я изменяю права доступа к папкам кэшей и журналов на 100%, чтобы их можно было записывать в $EB_CONFIG_APP_USER - в этом случае webapp пользователь
Ответ 5
Пробовал переопределить getCacheDir?
в app/AppKernel.php:
public function getCacheDir()
{
return "/path/to/the/cache";
}
Ответ 6
На основании ответов @rhunwicks здесь my .ebextensions/symfony.config
:
commands:
01updateComposer:
command: export COMPOSER_HOME=/root && /usr/bin/composer.phar self-update
files:
"/opt/elasticbeanstalk/hooks/appdeploy/post/01-cachewarm.sh":
mode: "000755"
owner: root
group: root
content: |
#!/usr/bin/env bash
. /opt/elasticbeanstalk/support/envvars
cd $EB_CONFIG_APP_CURRENT
php app/console cache:clear --env=prod
php app/console assetic:dump --env=prod
Убедитесь, что в вашем композиторе нет "symfony-assets-install": "symlink"
, чтобы не тратить часы, пытаясь понять, почему символические ссылки указывают на /var/app/ondeck/src/BundleName/MyBundle/Resources/public
вместо папки current
.