Как добиться непрерывного деплоя с docker?

Добрый день! Есть потребность выкатывать новую версию приложения без простоя, не могу добиться.
Использую 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
  • Вопрос задан
  • 312 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы