在Jenkinsfile中创建使用Dockerfile创建的Docker容器内运行命令

4

我已经创建了一个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"
        }
    }
}   
}
3个回答

6

根据 ls 的输出,您对它有误解。

对于 Jenkins 流水线 Docker DSL,它会将 Jenkins 作业工作区挂载到 Docker 容器中,并将 Docker 的 WORKDIR 更改为 Jenkins 作业工作区。

因此,当您在容器内执行 ls 命令时,它将打印出 Jenkins 作业工作区中的文件和文件夹。

您可以尝试使用其他命令或针对主机不存在的其他文件夹来执行 ls 命令,以证明它确实是在容器内而不是主机上被执行的。


1
这几乎可以肯定是误解发生的根源。 - Matt Schuchard

2

You may using -> 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"
            }
        }
  }

在由docker-compose创建的Docker容器内部运行命令是否可行? - Eugen Konkov

0

你需要在 stages 括号内编写代理创建阶段:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接