Правильный способ сохранить процесс на контейнере - PullRequest
0 голосов
/ 31 октября 2018

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

В настоящее время я создал внешний образ докера для обработки моего агента 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

1 Ответ

0 голосов
/ 31 октября 2018

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...