Как развернуть файл docker-compose на сервере развертывания Linux из задания сборки Jenkins?

Мое задание сборки Jenkins компилирует код, затем создает два образа Docker (каждый из которых является отдельной частью приложения) и публикует их.

Затем приходит время их развертывания на локальных серверах Linux. У меня есть файл docker-compose.yaml, который должен все настроить и запустить.

Моя проблема в том, что я ищу способ сделать три вещи:

  1. Мне нужно поместить файл компоновки на сервер(ы) развертывания которые не находятся под контролем Дженкинса, что, возможно, позволяет какому-то демону обрабатывать их, так как образы Docker уже загружены в репозиторий Docker. У меня есть root-доступ к серверам развертывания, учетные данные ssh находятся в Jenkins, и я могу устанавливать вещи на серверах развертывания. Итак, я попытался сделать это с помощью scp, используя пользователя специальной службы, но у него нет разрешений на создание каталога (например: /app) - я попытался обойти это, добавив этого пользователя в корневую группу (usermod -aG root username) - все еще такая же ошибка.
  2. Как только файл компоновки будет готов, я предполагаю, что смогу развернуть (поскольку тот же пользователь также находится в группе docker) с флагом демона, но как насчет сценария, когда приложение уже запущено, и я хочу просто развернуть обновление ( по сути вытащить более новую версию образов), и как убедиться, что Docker всегда будет поддерживать развернутый стек всегда работающим, даже если что-то выйдет из строя?
  3. Если работающий контейнер (ы) постоянно падает, как избежать бесконечного цикла и получать уведомления, когда, скажем, он пытался перезапустить его уже 5 раз?

Модераторам ответ отредактировал и думаю стоит подумать над его повторным открытием. По крайней мере, для меня он далеко не слишком широк, как утверждается сейчас. Он описывает точную проблему, с которой в настоящее время сталкиваются крупные компании, переходящие на DevOps. По крайней мере, вы можете написать комментарий о том, как его улучшить. Спасибо, в любом случае

Carlos Cavero 12.04.2019 22:36
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Kubernetes - это портативная, расширяемая платформа с открытым исходным кодом для управления контейнерными рабочими нагрузками и сервисами, которая...
Как создать PHP Image с нуля
Как создать PHP Image с нуля
Сегодня мы создадим PHP Image from Scratch для того, чтобы легко развернуть базовые PHP-приложения. Пожалуйста, имейте в виду, что это разработка для...
2
1
743
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я бы скопировал скрипт, чтобы останавливать и запускать контейнеры, когда доступно новое изображение:

  1. Scp должен работать, как описано в Используйте учетные данные ssh в конвейере jenkins с помощью ssh, scp или sftp.
  2. Вы должны скопировать скрипт остановки (docker-compose down) и запуска контейнеров (docker-compose up -d) вместе с файлом docker-compose. Затем демон должен выполнить сценарий. РЕДАКТИРОВАТЬ: кажется, можно использовать docker stack deploy -c /path/to/docker-compose.yml stack_name --with-registry-auth без необходимости каждый раз останавливаться/запускаться!
  3. Вы можете использовать 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, а затем загрузить в серверы.. Как еще это могло бы работать?

Carmageddon 11.04.2019 00:12

У вас есть репозиторий на GitHub, чтобы я мог посмотреть? # 1 Проверьте примеры. Вы можете настроить серверы развертывания как подчиненные Jenkins. Тогда не нужно ни копировать, ни ssh скрипт. Jenkins может загрузить ваш репозиторий в узел и выполнить команду docker-compose #3 yes jenkins определяет сбой работающего контейнера и останавливает конвейер, информируя об ошибке.

Carlos Cavero 11.04.2019 00:20

О, нет, извините, это внутреннее помещение внутри компании. Я не уверен, что могу настроить серверы как подчиненные jenkins, мы не администраторы, есть целая другая команда, управляющая серверами jenkins и его плагинами. Посмотрите на это просто : я получил конечный продукт в jenkins (образы докеров, которые также публикуются в репозитории помещения) - и мне нужен лучший способ развернуть/обновить его на других серверах, отличных от jenkins.

Carmageddon 11.04.2019 00:24

Хорошо, я понимаю. Таким образом, в основном вам нужно разместить композицию на сервере развертывания, и какой-то демон будет обрабатывать ее без контроля Jenkins, потому что изображения уже были загружены в репозиторий докеров, верно? У вас есть права root на сервере развертывания? А ваши полномочия в Дженкинсе? Вы можете установить что-то на сервере развертывания? Любое другое ограничение? Пожалуйста, обновите вопрос с этими ограничениями, и я подумаю о возможном обходном пути.

Carlos Cavero 11.04.2019 07:46

Да всем этим. Я обновлю вопрос через час.

Carmageddon 11.04.2019 14:00

Отлично @Carmageddon Я не понимаю, почему люди минусуют нас, но я вижу ваш вопрос довольно интересным, потому что это проблема в некоторых крупных компаниях (в том числе и в моей), поэтому я постараюсь вам помочь.

Carlos Cavero 11.04.2019 17:54

Спасибо! К сожалению, некоторые люди навязывают всем свое маленькое мнение только потому, что они более активны в SO и обладают дополнительными полномочиями. По крайней мере, вы единственный, кто может редактировать ответ, чтобы опубликовать что-то, никто другой не может, пока он находится в ожидании :( Я также проголосовал за, чтобы уравновесить отрицательный баланс. Кстати, я думаю, что решил проблему № 1, изменив групповые разрешения в каталоге загрузки, теперь это работает ... так что следующие № 2 и № 3 (развертывание стека докеров?), как обновить Как обеспечить его перезапуск в случае сбоя контейнера?

Carmageddon 11.04.2019 17:56

PS: Вы также можете проголосовать за открытие, это будет уже два голоса :)

Carmageddon 11.04.2019 17:58

Вы правы, по крайней мере, рецензенты могли бы дать несколько советов по его улучшению. Боюсь, у меня нет привилегий голосовать за повторное открытие вопроса. Я уже проголосовал за вас и поставил любимый вопрос. Посмотрите, что случилось.

Carlos Cavero 11.04.2019 18:13

Я изменил ответ. Надеюсь, это поможет вам! И удачи, чтобы снова открыть вопрос

Carlos Cavero 11.04.2019 22:49

Спасибо! Это так, я прошел через # 1 и # 2 (кстати, я использовал развертывание стека докеров - кажется, он обновляет стек без необходимости останавливать/запускать или -d!). Теперь я попробую ваш скрипт в качестве основы для мониторинга. Этот curl с -w - отличная идея! об этом я не подумал :)

Carmageddon 12.04.2019 19:00

Конечно! Я не понял команду развертывания стека! Я обновлю ответ позже. Приятно слышать!

Carlos Cavero 12.04.2019 19:12

@Carmageddon Я не знал, что ты уже отредактировал ответ, сегодня слишком много работы :) Все равно спасибо

Carlos Cavero 12.04.2019 22:28

Другие вопросы по теме