Правильный способ сохранить процесс в контейнере

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

В настоящее время я создал докер за пределами образа докера для обработки моего агента Jenkins, который будет выполнять автоматический перезапуск без использования супервизора в качестве решения (отсутствие поддержки python 3.7), и тем самым, поскольку я использую openjdk:slim в качестве базового образа, и я не Я не хочу устанавливать какие-либо дополнительные зависимости, я решил компенсировать отсутствие таких инструментов, как lsof и ps, или других для проверки того, запущен процесс или нет, записав запущенный процесс pid в файл, который будет использоваться для проверки того, запущен ли процесс или нет. существует или нет процесс по пути /proc/pid/status. В настоящее время это работает и является основной причиной создания этого решения для обработки автоматического запуска агентов.

Но у меня вопрос: это лучший или более подходящий подход?

Найдите следующий код с реализацией:

#!/bin/bash
set -e

agent_runner() {
    while :
    do
        if [ ! -f "/proc/$(cat /tmp/agent.pid)/status" ]
        then
            curl $JNLP_AGENT_DOWNLOAD_URL -o agent.jar
            java \
            -Dorg.jenkinsci.plugins.durabletask.BourneShellScript.HEARTBEAT_CHECK_INTERVAL=300 \
            -Dhttps.protocols=TLSv1.2 \
            -jar agent.jar \
            -jnlpUrl $JNLP_AGENT_URL \
            -secret $JENKINS_SECRET \
            -workDir "$JENKINS_WORKDIR" &
            echo $! > /tmp/agent.pid
        else
            :
        fi
        sleep 10
    done
}

while :
do
    if [ cat < /dev/tcp/"$TARGET" ]; then
      echo "Starting Agent"
      agent_runner
    else
      echo "Jenkins master is offline, waiting...."
    fi
    sleep 10
done

Ссылка на репозиторий: https://github.com/thcp/jenkins-agent-dod

Почему бы не запустить сервис в сервисе docker swarm? Если служба умирает, рой просто перезапускает службу на любом доступном хосте?

Dockstar 31.10.2018 16:21

Для этого конкретного сценария у нас есть агенты под powerpc или x86 vm, и для этого в некоторых проектах мы не можем использовать docker swarm.

thclpr 31.10.2018 16:26
0
2
45
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Если основной процесс в контейнере умирает, вы должны позволить контейнеру умереть вместе с ним.

Docker и различные уровни над ним могут перезапускать целые контейнеры. Существует опция docker run --restart для базового интерфейса командной строки Docker и эквивалентная опция Docker Compose, а перезапуск умирающих контейнеров после некоторой отсрочки является поведением по умолчанию для модулей Kubernetes.

Итак, если вы позволите контейнеру умереть самостоятельно, у вас будет готовая поддержка для перезапуска движка контейнера, без добавления какой-либо специальной поддержки в ваш образ; просто установите CMD на то, что вам действительно нужно сделать с контейнером, и вперед. Этот подход также имеет то преимущество, что если вы обнаруживаете, что ваша среда стала нестабильной («Я зависим от базы данных, и она недоступна»), процесс может прекратить сам себя и позволить ему перезапустить позже, когда, как мы надеемся, среда улучшилась.

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