Мое задание сборки Jenkins компилирует код, затем создает два образа Docker (каждый из которых является отдельной частью приложения) и публикует их.
Затем приходит время их развертывания на локальных серверах Linux. У меня есть файл docker-compose.yaml
, который должен все настроить и запустить.
Моя проблема в том, что я ищу способ сделать три вещи:
/app
) - я попытался обойти это, добавив этого пользователя в корневую группу (usermod -aG root username
) - все еще такая же ошибка.docker
) с флагом демона, но как насчет сценария, когда приложение уже запущено, и я хочу просто развернуть обновление ( по сути вытащить более новую версию образов), и как убедиться, что Docker всегда будет поддерживать развернутый стек всегда работающим, даже если что-то выйдет из строя?Я бы скопировал скрипт, чтобы останавливать и запускать контейнеры, когда доступно новое изображение:
docker stack deploy -c /path/to/docker-compose.yml stack_name --with-registry-auth
без необходимости каждый раз останавливаться/запускаться!Вы можете использовать curl для проверки работы служб (в качестве проверки работоспособности). Повторите попытку несколько раз, возвращая ошибку, если одна из служб недоступна, как объясняется здесь:
#!/bin/bash
url='http://website-to-test'
attempts=5
timeout=5
online=false
echo "Checking status of $url."
for (( i=1; i<=$attempts; i++ ))
do
code=`curl -sL --connect-timeout 20 --max-time 30 -w "%{http_code}\\n" "$url" -o /dev/null`
echo "Found code $code for $url."
if [ "$code" = "200" ]; then
echo "Website $url is online."
online=true
break
else
echo "Website $url seems to be offline. Waiting $timeout seconds."
sleep $timeout
fi
done
if $online; then
echo "Monitor finished, website is online."
exit 0
else
echo "Monitor failed, website seems to be down."
exit 1
fi
ОБНОВИТЬ: Измените ответ с учетом ваших ограничений
Спасибо, на #1 - у меня уже есть скрипт компоновки в репозитории. Мне нужно только скопировать модифицированную версию с указанными на ней опубликованными версиями образа докера на сервер. В № 3 - я на самом деле ссылался на сбой работающего контейнера, а не на процесс сборки. # 2 Я не думаю, что это сработает, потому что я не делаю коммиты из git ... Я имею в виду, что в компоновке у меня есть заполнитель, например: VERSION, а затем заменить его номером встроенного образа с помощью sed на jenkins, а затем загрузить в серверы.. Как еще это могло бы работать?
У вас есть репозиторий на GitHub, чтобы я мог посмотреть? # 1 Проверьте примеры. Вы можете настроить серверы развертывания как подчиненные Jenkins. Тогда не нужно ни копировать, ни ssh скрипт. Jenkins может загрузить ваш репозиторий в узел и выполнить команду docker-compose #3 yes jenkins определяет сбой работающего контейнера и останавливает конвейер, информируя об ошибке.
О, нет, извините, это внутреннее помещение внутри компании. Я не уверен, что могу настроить серверы как подчиненные jenkins, мы не администраторы, есть целая другая команда, управляющая серверами jenkins и его плагинами. Посмотрите на это просто : я получил конечный продукт в jenkins (образы докеров, которые также публикуются в репозитории помещения) - и мне нужен лучший способ развернуть/обновить его на других серверах, отличных от jenkins.
Хорошо, я понимаю. Таким образом, в основном вам нужно разместить композицию на сервере развертывания, и какой-то демон будет обрабатывать ее без контроля Jenkins, потому что изображения уже были загружены в репозиторий докеров, верно? У вас есть права root на сервере развертывания? А ваши полномочия в Дженкинсе? Вы можете установить что-то на сервере развертывания? Любое другое ограничение? Пожалуйста, обновите вопрос с этими ограничениями, и я подумаю о возможном обходном пути.
Да всем этим. Я обновлю вопрос через час.
Отлично @Carmageddon Я не понимаю, почему люди минусуют нас, но я вижу ваш вопрос довольно интересным, потому что это проблема в некоторых крупных компаниях (в том числе и в моей), поэтому я постараюсь вам помочь.
Спасибо! К сожалению, некоторые люди навязывают всем свое маленькое мнение только потому, что они более активны в SO и обладают дополнительными полномочиями. По крайней мере, вы единственный, кто может редактировать ответ, чтобы опубликовать что-то, никто другой не может, пока он находится в ожидании :( Я также проголосовал за, чтобы уравновесить отрицательный баланс. Кстати, я думаю, что решил проблему № 1, изменив групповые разрешения в каталоге загрузки, теперь это работает ... так что следующие № 2 и № 3 (развертывание стека докеров?), как обновить Как обеспечить его перезапуск в случае сбоя контейнера?
PS: Вы также можете проголосовать за открытие, это будет уже два голоса :)
Вы правы, по крайней мере, рецензенты могли бы дать несколько советов по его улучшению. Боюсь, у меня нет привилегий голосовать за повторное открытие вопроса. Я уже проголосовал за вас и поставил любимый вопрос. Посмотрите, что случилось.
Я изменил ответ. Надеюсь, это поможет вам! И удачи, чтобы снова открыть вопрос
Спасибо! Это так, я прошел через # 1 и # 2 (кстати, я использовал развертывание стека докеров - кажется, он обновляет стек без необходимости останавливать/запускать или -d!). Теперь я попробую ваш скрипт в качестве основы для мониторинга. Этот curl с -w - отличная идея! об этом я не подумал :)
Конечно! Я не понял команду развертывания стека! Я обновлю ответ позже. Приятно слышать!
@Carmageddon Я не знал, что ты уже отредактировал ответ, сегодня слишком много работы :) Все равно спасибо
Модераторам ответ отредактировал и думаю стоит подумать над его повторным открытием. По крайней мере, для меня он далеко не слишком широк, как утверждается сейчас. Он описывает точную проблему, с которой в настоящее время сталкиваются крупные компании, переходящие на DevOps. По крайней мере, вы можете написать комментарий о том, как его улучшить. Спасибо, в любом случае