Как запретить докеру остановить / удалить контейнер при ошибке - PullRequest
0 голосов
/ 08 ноября 2018

Предположим, у меня есть отличный код Jenkins, который запускает Docker-контейнер, и внутри него будет работать некоторый bash:

    docker.withRegistry(dockerRegistry, dockerCredentials) {
    docker.image(new String(dockerImage + ":" + dockerVersion)).inside(mountCommand) {

        try {
            withEnv(["AWS_PROFILE=${mappings['stackEnv']}",
                     "FULL_PACKAGE_VERSION=${mappings['revision']}",
                     "ARTIFACTORY_USER=${IC_ARTIFACTORY_USER}"]) {
                withCredentials([
                        string(credentialsId: IC_ARTIFACTORY_KEY, variable: 'ARTIFACTORY_KEY')
                ]) {
                    sh '''
                    bash -x Jenkinsfile-e2e-test.sh
                '''
                }
            }
        } finally { }
    }
}

Если Jenkinsfile-e2e-test.sh падает по какой-то причине, Jenkins автоматически остановится и удалит контейнер:

09:40:08 $ docker stop --time=1 6e78cf6d940cb1ca1cb1c729617fd3e6ba3fa4085c2750908dff8f2a1e7ffeed
09:40:09 $ docker rm -f 6e78cf6d940cb1ca1cb1c729617fd3e6ba3fa4085c2750908dff8f2a1e7ffeed

Как я могу помешать Дженкинсу уничтожить контейнер при ошибке?

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

Дженкинс всегда останавливается и удаляет контейнер, как только тело вашей команды .inside будет завершено. Независимо от того, успешно ли работает ваш bash-скрипт или нет.

Рациональное обоснование заключается в том, что Дженкинс позаботится о ведении домашнего хозяйства за вас, чтобы вы не получили множество остановленных контейнеров, висящих на вашей сборочной машине.

Это относится к методам Image.withRun и Image.inside. Если вы хотите контролировать жизненный цикл контейнера, вы должны использовать Image.run:

Использует Docker для запуска образа и возвращает контейнер, который вы можете остановить позже

(из документы )

0 голосов
/ 08 ноября 2018

Вы можете убедиться, что команда не потерпит неудачу, используя это:

bash -x Jenkinsfile-e2e-test.sh || true

Или даже лучше:

bash -x Jenkinsfile-e2e-test.sh > e2e.log 2>&1 & || true
# check the log file and do something based on the log
...