【问题标题】:Running commands inside docker container created using Dockerfile in Jenkinsfile在 Jenkinsfile 中使用 Dockerfile 创建的 docker 容器内运行命令
【发布时间】:2019-04-03 02:43:07
【问题描述】:

我创建了一个 Jenkins 管道文件并创建了一个 Jenkinsfile。在 Jenkinsfile 中,我使用了 Dockerfile 代理,然后运行了一些步骤。这些步骤应该在 docker 内部运行,但它们在主机上运行。 她的代码。

#!/usr/bin/env groovy
@Library(['abc-jenkins','xyz-jenkins-library']) _
pipeline {
agent {
    dockerfile{
        dir 'TEST'
        filename 'dockerfile'
        label 'docker'
    }
}
stages {
    stage('Build Stage') {
        steps {
            echo 'testing stage running'
            sh "ls"
        }
    }
}   
}

【问题讨论】:

    标签: docker jenkins jenkins-pipeline


    【解决方案1】:

    你根据ls的输出误会了。

    对于 Jenkins 管道 docker DSL,它将 jenkins 作业工作区挂载到 docker 容器,并将 docker WORKDIR 更改为 jenkins 作业工作区。

    因此,当您在容器内执行ls 时,它将打印您的詹金斯作业工作区下的文件和文件夹。

    您可以尝试其他 cmd 或 ls 其他在主机中不存在的文件夹,以确认它确实在容器内而不是主机内执行。

    【讨论】:

    • 这几乎肯定是对正在发生的事情产生误解的根源。
    【解决方案2】:

    你可以使用 -> docker.image('image').inside{..}

    stage('BuildInside') {
             docker.image('ubuntu1804').withRun('-d=true -p 8888:8080') {c ->
                docker.image('ubuntu1804').inside{
                   /*  Do something here inside container  */
                   sh "ls"
                }
            }
      }
    

    【讨论】:

      【解决方案3】:

      您必须在阶段括号内编写代理创建阶段:

      stages {
          stage('Build Stage') {
              agent {
                 dockerfile{
                 dir 'TEST'
                 filename 'dockerfile'
                 label 'docker'
              }
              steps {
                 echo 'testing stage running'
                 sh "ls"
             }
      }
      

      【讨论】:

        猜你喜欢
        • 2015-04-15
        • 1970-01-01
        • 1970-01-01
        • 2022-12-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-15
        • 1970-01-01
        相关资源
        最近更新 更多