Docker и Laravel, деплой
При деплое на сервер Laravel приложения, через ci/cd или руками, нужно ли выполнять docker compose -build по новой? Насколько я понимаю это актуально, только для ci/cd, на случай когда docker-compose.yml изменяется, в случае ручного деплоя когда изменился только код в приложении этого делать не нужно?
Ответы (2 шт):
Из личного опыта, пересборка контейнера не делается. Полноценно CI/CD не используем, используем update bash скрипт. Есть два приложения - клиент (vue) и API (backend) на Ларавел Бэкэнд - подтягивается из гита изменения, делается git stash (если вдруг залетело что-то не из репозитория), применяются миграции и все Фронт - npm ci (отличие от npm i в том, что ci берет из package-lock.json, для прода актуален фикс версий), затем npm build
- опционально тесты могут быть. Конечно же в идеале еще и переключение между экземплярами приложения для непрерывной работы (но у нас это не используется пока что)
docker build собирает контейнер заново. Но если вдруг в docker-compose затесались изменения (случайно или намеренно), то контейнер соберется заново и обнулится. Если у вас БД в контейнере - то она сотрется.
Считаю делать docker build на автомате слишком опасно и не оправдано. Контейнер пересобираться не должен в случае хранения важных данных в самом контейнере, должен обновляться экземпляр приложения. Если docker контейнер не хранит важные данные, то можете и пересобирать
Зависит от того, как вы доставляете свое приложение на окружения.
Мы используем Symfony для серверной части и у нас клиентская часть приложения отдельно (React), но это дело не меняет.
Мы создаем сборки в CI/CD:
- Для GitLab. Запускаем в них анализаторы и тесты. Тут используем dev зависимости, чтобы все это делать. Образ имеет дополнительные расширения для PHP, типа pcov, чтобы узнавать покрытие кода тестами не ожидая несколько минут.
- Для Sandbox (Dev окружение). Тут также dev зависимости, но дополнительные пакеты, типа Xdebug не ставятся.
- Для Stage и Production (Prod). Используем основные зависимости для проекта без dev зависимостей.
Для локальной разработки мы используем еще один образ, который создается локально и не отправляется на сервер.
Мы можем локально также использовать образы созданные для Sandbox или Stage, чтобы тестировать код с учетом зависимостей.
Мы распространяем код прямо в готовом образе, за исключением локальной разработки. Готовый образ это прям полноценный рабочий ящик, сервис, который можно запустить и работать с ним.
Локально образ создается один раз, потому что там мы монтируем локальные файлы и используем их в образе. Код и образ там изменяются независимо друг от друга. Если мы внесем изменения в Dockerfile, то локальный образ нужно будет пересобрать.
БД и другие хранилища используют свои сервисы и тома для хранения данных, чтобы они не слетали при повторном развертывании проекта на окружениях.
Так что все зависит от вашего flow и способа распространения кода по серверам, будь то вручную или автоматически.