Jenkins docker容器总是添加cat命令

时间:2019-03-27 04:15:55

标签: docker jenkins jenkins-pipeline terraform

我正在创建Jenkins管道以在Docker容器上运行terraform。

这是我的管道脚本。

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

这好像詹金斯(Jenkins)添加了一条cat命令来运行图像hashicorp / terraform:full。

请注意,由于 hashicorp / terraform:full -entrypoint = / bin / bash 覆盖了 / bin / bash 的入口点em>已经定义了一个入口点。

3 个答案:

答案 0 :(得分:1)

这似乎是jenkins中docker-workflow-plugin的默认行为。 [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/browse/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:/#

答案 1 :(得分:1)

我不得不将ENTRYPOINT更改为空,以禁用terraform容器定义中的入口点定义。而且我认为light图像足以执行地形。

我使用以下脚本进行工作:

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

答案 2 :(得分:0)

在我的情况下,entrypoint给我带来了一些麻烦,因此我需要通过将空的entrypoint参数传递给inside方法来覆盖它,如下所示:

pipeline {
    agent { 
        label 'some_label'
    }
    stages {
        stage('execute') { 
            steps {
                script {
                    img = docker.build("docker_image_name:docker_image_tag")
                    
                    img.inside('--entrypoint= -e NODE_ENV=test') {
                        sh 'npm install --dev'
                        sh 'npm run test'
                    }                   
                }
            }
        }
    }
}

此示例类似于Trying to replicate注释,但语法不同。

备注:节点js项目之间的npm test之类的npm命令可能有所不同,因此您需要从开发人员那里获取相关命令。

如果该示例仍然无法为您服务,那么您可能需要像下面这样更改docker映像entrypoint@S.Spieker

您可以在此处了解有关docker-flow插件的更多信息:https://github.com/SonarSource/sonar-scanner-cli-docker/pull/31/files

更多示例:https://docs.cloudbees.com/docs/admin-resources/latest/plugins/docker-workflow