Добрый день! Есть потребность выкатывать новую версию приложения без простоя, не могу добиться.
Использую capistrano+docker swarm. Все службы докера запускаю на одном сервере. Капистрано выкачивает новую версию из репозитория, перелинковывает папку с последним релизом на current (я пробрасываю эту папку внутрь контейнера). При первом деплое я скачиваю и компилирую образа с помощью докер-компоуз. При компиляции образ с рельсой скачивает и устанавливает нужные гемы. Когда на сервере появляются готовые образы я запускаю docker stack deploy -c compose.yml myapp.
Внутри контейнера с рельсой лежит скрипт для старта приложения. Что он делает:
1. bundle install (на случай если Gemfile обновился обновляет гемы уже не в образе, а в контейнере)
2. прогоняет миграции
3. прекомпилирует ассеты
4. стартует рельсу
Первый деплой происходит хорошо. Далее когда выкатываю следующую версию, сами образы остаются неизменными (их я больше не пересобираю), папка каррент меняется (папка паблик с ассетами здесь пустая), запускаю docker stack deploy -c compose.yml myapp - вижу пишет службы обновились.
Что получаю - Захожу на сайт - там исчезли все стили, в логах не вижу рестарта приложения. Т.е. я так понимаю, раз докер видит, что образы не обновились, то и не надо рестартить приложение, но мне нужно чтобы он рестартовал и выполнил те 4 пункта, чтобы появились новые стили и скрипты, установились нехватающие гемы. Плюс ко всему хочу получить бесшовный деплой - т.е. старая служба должна работать, пока стартует обновленная. Что я делаю не так?
version: "3.7"
services:
pg:
image: postgres:11.5-alpine
env_file:
- ./.env
environment:
- POSTGRES_USER=${DATABASE_USER}
- POSTGRES_PASSWORD=${DATABASE_PASS}
- POSTGRES_DB=${DATABASE_NAME}
ports:
- 5432:5432
volumes:
- /var/www/myapp/shared/db/pg/etc:/etc/postgresql
- /var/www/myapp/shared/log/pg:/var/log/postgresql
- /var/www/myapp/shared/db/pg/data:/var/lib/postgresql/data
- /var/www/myapp/shared/db/pg/backups:/backups
- /tmp:/tmp
deploy:
placement:
constraints: [node.role == manager]
replicas: 1
redis:
image: redis:5.0.3-alpine
volumes:
- /var/www/myapp/shared/db/redis:/data
- /tmp:/tmp
rails:
image: instajet/rails:6.1
build:
context: .
dockerfile: config/docker/rails/DockerFile
environment:
- BUNDLE_PATH=/bundle
- RAILS_ENV=production
depends_on:
- pg
- redis
volumes:
- /var/www/myapp/current:/instajet:Z
- /var/www/myapp/shared/log/rails:/instajet/log
- /var/www/myapp/shared/log/puma:/instajet/log/puma
- /tmp:/tmp
command: startup.sh
deploy:
placement:
constraints: [ node.role == manager ]
replicas: 1
nginx:
image: nginx:1.17.6
volumes:
- /var/www/myapp/current/public:/public
- /var/www/myapp/current/config/docker/nginx/nginx.conf:/etc/nginx/nginx.conf
- /var/www/myapp/shared/log/nginx:/log
- /tmp:/tmp
depends_on:
- rails
ports:
- '80:80'
deploy:
placement:
constraints: [ node.role == manager ]
replicas: 1