Докер-контейнер Jenkins всегда добавляет команду cat - PullRequest
2 голосов
/ 27 марта 2019

Я создаю конвейер Jenkins для запуска terraform в контейнере Docker.

Вот мой конвейерный скрипт.

pipeline {
    agent {
        docker {
            image 'hashicorp/terraform:full'
            args '--entrypoint=/bin/bash'
        }
    }
    stages {
        stage('execute') { 
            steps {
                sh 'terraform --version' 
            }
        }
    }
}

При запуске этого конвейера на Jenkins я получаю ошибку ниже.

$ docker run -t -d -u 995:993 --entrypoint=/bin/bash -w /var/lib/jenkins/workspace/terraform -v /var/lib/jenkins/workspace/terraform:/var/lib/jenkins/workspace/terraform:rw,z -v /var/lib/jenkins/workspace/terraform@tmp:/var/lib/jenkins/workspace/terraform@tmp:rw,z -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** hashicorp/terraform:full cat

$ docker top a0b801d657d0fffdfa95c387564128b130ab1d28569ad59bd0151c8b7faf6ffd -eo pid,comm

java.io.IOException: Failed to run top 'a0b801d657d0fffdfa95c387564128b130ab1d28569ad59bd0151c8b7faf6ffd'. Error: Error response from daemon: Container a0b801d657d0fffdfa95c387564128b130ab1d28569ad59bd0151c8b7faf6ffd is not running

Похоже, что Дженкинс добавляет команду cat для запуска образа hashicorp / terraform: full.

Обратите внимание, что я переопределил точку входа на / bin / bash , используя - entrypoint = / bin / bash , поскольку hashicorp / terraform: full уже определена точка входа.

1 Ответ

1 голос
/ 27 марта 2019

Это поведение по умолчанию для docker-workflow-plugin в jenkins. [FIXED JENKINS-41316] Переключить «изнутри» обратно в CMD, определить, была ли точка входа плохо спроектирована # 116 https://github.com/jenkinsci/docker-workflow-plugin/pull/116

мы запускаем любой процесс, указанный в изображении (даже sh -c) Их цель That will break in most images, since for this purpose we need to start a container, pause it while we exec some stuff, and then stop it, without having to guess what its “main command” might run and when it might exit on its own. That is why we cat (I also have considered sleep infinity or some POSIX-compliant variant).

https://issues.jenkins -ci.org / просмотр / JENKINS-39748

код здесь: https://github.com/jenkinsci/docker-workflow-plugin/blob/50ad50bad2ee14eb73d1ae3ef1058b8ad76c9e5d/src/main/java/org/jenkinsci/plugins/docker/workflow/WithContainerStep.java#L184

Они хотят, чтобы контейнер был / * зависал до тех пор, пока его не убили * /.


Оригинальный ответ:

Попытаетесь ли вы запустить без опции -d (что означает запуск в фоновом режиме)

docker run -it --entrypoint=/bin/bash hashicorp/terraform:full

Затем вы можете войти в контейнер, чтобы запустить все, что вы хотите.

В качестве примера возьмем nginx:

docker run -it --entrypoint=/bin/bash nginx
root@e4dc1d08de1d:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@e4dc1d08de1d:/# cat /var/log/
apt/      btmp      dpkg.log  faillog   lastlog   nginx/    wtmp
root@e4dc1d08de1d:/# cat /var/log/faillog
root@e4dc1d08de1d:/#
...