Я не уверен, что мой вопрос уместен, поскольку я могу попытаться использовать инструменты (Capistrano и Docker), которые не должны смешиваться.
Недавно я докционировал приложение, которое развертывается с Capistrano. Docker compose используется как для разработки, так и для промежуточной среды.
Так выглядит мой проект (файлы приложений не отображаются):
Capfile
docker-compose.yml
docker-compose.staging.yml
config/
deploy.rb
deploy
staging.rb
Файлы Docker Compose создают все необходимые контейнеры (Nginx, PHP, MongoDB, Elasticsearch и т.д.) для запуска приложения в среде разработки или промежуточного процесса (отсюда некоторые конкретные параметры, определенные в docker-compose.staging.yml
).
Приложение развертывается в промежуточной среде с помощью этой команды:
cap staging deploy
Архитектура папок на сервере - это Capistrano:
current
releases
20160912150720
20160912151003
20160912153905
shared
В каталоге current
промежуточного сервера выполняется следующая команда для создания всех необходимых контейнеров для запуска приложения:
docker-compose -f docker-compose.yml -f docker-compose.staging.yml up -d
Пока все хорошо. В следующем развертывании все сложнее: символическая ссылка current
укажет на новый каталог каталога releases
:
- Если
deploy.rb
определяет команды, которые должны выполняться внутри контейнеров (например,docker-compose exec php composer install
для PHP), Docker сообщает, что контейнеры еще не существуют (поскольку существующие были созданы в предыдущей папке выпуска). - Если в процессе развертывания Capistrano выполняется команда
docker-compose up -d
, я получаю некоторые ошибки из-за конфликтов портов (предыдущие контейнеры все еще существуют).
У вас есть идея о том, как решить эту проблему? Должен ли я отойти от Капистрано и сделать что-то другое?
Идея заключалась в том, чтобы сохранить (близкое) развертывание с нулевым временем простоя, которое предлагает Capistrano с гибкостью контейнеров Docker (например, несколько версий PHP для различных приложений на одном сервере).