Constantin
Добрый день.
George
привет-привет
Constantin
Подскажите пожалуйста, есть ли возможность обновить контейнер после возникновения внешнего события. Например у меня есть сервер и клиенты. Сервер развернут в контейнере, клиенты качают обновления. Если клиент скачал обновление он пишет в БД запись. Как только все клиенты получили обновления нужно обновить сервер.
George
нет
George
если у приложения есть автообновление, то его поведение в контейнере и вне не будет отличаться. Хотя я бы все равно 10 раз порекомендовал подумать следует ли так делать
George
т.к. все данные, которые изменяются относительно образа - пишутся на эфемерный слой
George
поэтому верный путь обновления ПО - перестартовать его с нового образа
George
но сделать это изнутри контейнера можно только, если прокинуть внутрь docker socket
George
а это сразу риски по ИБ
George
причем существенные
Constantin
Мне не надо изнутри. Обновлять образ внутри контейнера моветон.
Constantin
Это все понятно.
Constantin
Можно ли как-то обновить контейнер в зависимости от события?
Constantin
скрипты это решение, как и какая-то служба которая запускает эти скрипты. А с помощью webhook-ов и штатных средств можно этого добиться?
Constantin
Я думаю в качестве web-cервера использовать тот же что и для публикации образов
su
обычно для этого используется ci у приличных людей
+ да вроде teamcity, можно прямо из докера. по идее
kSandr
+ да вроде teamcity, можно прямо из докера. по идее
да все-что угодно можнго прямо из докера )
kSandr
ну и как сказали выше , всегда можно наговнять и обмазаться баш скриптами
Constantin
Это если сервак один, тогда да. А если решение представляет клиент-серверную архитектуру причем сервер у клиентов и непонятно что у них с связью, внутренними политиками и т.д. то CI вряд ли поможет.
George
ну, смотри. Повторюсь - можно засунуть автообновление внутрь контейнера. Ты же можешь устанавливать софт внутри контейнера
George
но это такое себе
Constantin
Дык поэтому и спрашиваю
kSandr
- клиент-серверная архитектура, - сервер у клиентов
George
т.е. твоя задача передать им пакет с обновлением
kSandr
а что у тебя ? )))))) ахахахахах
Constantin
а у меня репозиторий образов
kSandr
верно
это просто пример наркомании )
kSandr
тогда ansible?
так сервер же у клиентов, а не у него, как он будет ходить к клиентам
kSandr
ансибл предполагает что сервер у него к которому он ходит
su
так сервер же у клиентов, а не у него, как он будет ходить к клиентам
vpn прокинуть, по openvpn, и наговнять параметров. когда подключатся к тебе чтобы ты их машинки видел желательно форсированно чтобы не рыпались
kSandr
верно
ты всегда можешь вмазать в крон скрипт который будет дергать версию из базы, и сверять с текущей, и если версии расходятся - обновлять до латеста
kSandr
т.е. ты же не можешь ходить и обновлять чужое, ПО , то что не находится у тебя ... т.е. если П.О. у клиента, то это уже его ответственность и он сам уже должен следить за обновлениями получается, ... либо по крону трекать последнюю версию и обновлять её , но не уверен как это должно реализоваться извне контейнера , т.е. если у тебя нет доступа на саму клиентскую машину, а только на то, что внутри контейнера .... хотя ты всегда можешь запускать контейнер с прокинутым внутрь сокетом докера и дергать за докер изнутри )
Constantin
kSandr
Спасибо, наверное так и поступлю. Просто думал может есть какое-то более элегантное решение. :)
более элегантное решение это когда ты имеешь полный доступ к сервису который мейнтейнишь, .... а так, ты можешь слушать порт и по хуку обновляться как пример, если убрать крон ... т.е. нужна некая апишка, через которую ты будешь управлять
George
ну, в общем, опять вопрос не докер специфичен. Как таковой
kSandr
да
Constantin
Ок. Всем спасибо
Richard
Народ, а какую команду поставить на сервер , чтобы он запускался после бд?
simplemice.eth
Richard
A в docker-compose ?
kSandr
Richard
Richard
Шутники , а
Richard
su
в докер компоуз безопасно, ж
Vasiliy
а как-то можно форсировать чтобы сеть оверлей наползла на воркера в сварме?
Richard
 # Ключевое слово 'depends_on' позволяет указывать, должен ли сервис,    # прежде чем запуститься, ждать, когда будут готовы к работе другие сервисы.    # Нам нужно, чтобы сервис 'client' дождался бы готовности к работе сервиса 'server'.    depends_on:      - server Это оно?
George
В твоём случае
George
https://habr.com/ru/post/454552/#comment_20240656
George
Вот так, но это костыль
kSandr
Оно не готовности ждет
да и в третьем композе выпилено )
George
Ты понимаешь, что "контейнер создан" и "контейнер готов" - это два принципиально разных статуса ?
George
А чего?
Точно не того, что контейнер готов к приему трафика
Richard
А без костылей, тогда как?
Vasiliy
это веб 3.0.. тут всё на костылях))
kSandr
А без костылей, тогда как?
без костылей у тебя приложение должно уметь само дожидаться базы
Richard
Restart: always, понял
George
Restart: always, понял
Ну, коллеги отмечают, что это может быть перебором
George
Например, приложение подтягивает с диска файл 1гиб, а потом падает
George
Зачем лишний раз диск дрочить?
kSandr
Restart: always, понял
можешь использовать что-то вроде такого ... cat /home/wait.sh #!/bin/sh # wait-for-postgres.sh set -e host="$1" service="$2" shift cmd="$@" until docker exec "$host" ps | grep "$service" > /dev/null ; do >&2 echo "Service is unavailable - sleeping" sleep 1 done #>&2 echo "Service is up - executing command" #exec $cmd
George
Oh wait #$_-$&$-_- shit ^€€¥^-#-#__
kSandr
Oh wait #$_-$&$-_- shit ^€€¥^-#-#__
не думал что увидишь такое вживую а ? ))))) хД
George
Мы аналогично healthy проверяли