Можно ли не удалять контейнер, запущенный с помощью плагина docker jenkins? - PullRequest
1 голос
/ 26 февраля 2020

У меня есть конвейер, начинающийся с:

pipeline {
    agent {
        docker {
            image 'ubuntu'
        }
    }

В конце сборки, в случае успеха или неудачи конвейер заканчивается:

$ docker stop --time=1 922fc93c1ff65758270cd2ac9dbdc30549ea8acb000ce5982dfa1fc4a9ed79a0
$ docker rm -f 922fc93c1ff65758270cd2ac9dbdc30549ea8acb000ce5982dfa1fc4a9ed79a0

Есть ли способ отключить шаг rm -f.

Это для отладки. Сейчас я сплю где-то, что очень неудобно.

Ответы [ 3 ]

1 голос
/ 26 февраля 2020

Вы можете достичь этого, но не с помощью синтаксиса docker {} , потому что

Выполните конвейер или этап с заданным контейнером, который будет динамически подготовлен

У вас есть несколько других опций, таких как label и args, но ни одна из опций не помешает идее плагина: запустите контейнер, выполните ваши операции, остановите и удалите контейнер.

Чтобы переопределить это поведение, вам придется выполнить действия, выполняемые плагином jenkins:
- выполнить непосредственно клиентскую программу docker в вашем конвейере (необходимо иметь клиент docker на Машина Дженкинса)
- написать команды для выполнения в образе

Что-то вроде:

stage('Docker execution') {

    steps {                     
            sh "CONTAINER_ID= $(docker run ubuntu:fooVersion)"
            sh "docker exec -ti $CONTAINER_ID commandToExecuteOnContainer"
        }
}

Обратите внимание, что он будет создавать новые образы Ubuntu при каждом выполнении конвейера. Так что даже в целях отладки он может быстро превратиться в беспорядок.
В целях отладки я думаю, что вызывать функцию ожидания конвейера Jenkins проще и удобнее.
Например:

steps {                     
            // ....
            sleep(time:15,unit:"MINUTES")
      }

Если указанного c времени недостаточно, поскольку вам необходимо проверить состояние контейнера, возможно, через несколько часов или дней, вы можете сохранить его состояние, используя подкоманду commit из docker, например docker commit myContainerId.
Вы можете выполнить эту команду непосредственно в конвейере Jenkins (почему бы не определить параметр отладки в качестве входных данных конвейера) или выполнить ее непосредственно на компьютере, где клиент docker обращается к реестру docker используется трубопроводом.

1 голос
/ 26 февраля 2020

Благодаря @davidxxx, который поставил меня на путь решения.

Предложенный им ответ не требует совместного использования сокета docker. Поскольку я хотел решение для отладки, то, что я придумал, прекрасно, так как оно не идет в производство. То, что он предлагает, более многословно, но безопаснее. Так что все сводится к тому, что вам нужно.

Мое решение: в конвейере поделитесь сокетом с только что созданным контейнером

pipeline {
    agent {
        docker {
            image 'ubuntu'
            args '-v /var/run/docker.sock:/var/run/docker.sock'
        }
    }

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

docker commit $(basename $(cat /proc/1/cpuset)) foo 

$(basename $(cat /proc/1/cpuset)) получает га sh текущего контейнера, найденного здесь

foo, являющегося название нового изображения

0 голосов
/ 26 февраля 2020
  1. Удалить все Docker Контейнеры
    docker rm container $(docker container ls -aq) 
      note:--(if you want add super user)
    
  2. Удалить все Docker Изображения
    docker rmi  $(docker images -aq) to delete all docker images
      note:--(if you want add super user)
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...