Jenkinsfile 中的“withRun”和“inside”有什么区别?

Ism*_*ail 25 jenkins docker jenkins-pipeline

我有一个 Jenkinsfile,我试图在其中执行npm run test一个容器。当我用inside它运行时会失败,但是当我用withRun它运行时会按照我的意愿运行。

代码参考 inside

stage('Test') {
    docker.image('justinribeiro/chrome-headless').inside ("-p 9222:9222 --security-opt seccomp=$WORKSPACE/chrome.json") { 
        sh label: 
        'Running npm test', 
        script: '''
        npm run test
        '''
      }
    }
Run Code Online (Sandbox Code Playgroud)

withRun

stage('Test') {
    docker.image('justinribeiro/chrome-headless').withRun ("-p 9222:9222 --security-opt seccomp=$WORKSPACE/chrome.json") { 
        sh label: 
        'Running npm test', 
        script: '''
        npm run test
        '''

    }
  }
Run Code Online (Sandbox Code Playgroud)

现在我想了解它们之间的区别是什么。

我观察到inside增加了卷并cat在容器上运行,而withRun没有。

我还阅读了文档https://jenkins.io/doc/book/pipeline/docker/但理解得不够好。

更详细的解释将不胜感激。

谢谢。

Mat*_*ard 27

Image.run([args, command])
用于docker run运行图像,并返回一个您可以稍后停止的容器。可以添加其他参数,例如“-p 8080:8080 --memory-swap=-1”。可选命令相当于在镜像后指定的 Docker 命令。在构建中记录运行指纹。

Image.withRun[(args[, command])] {...}
就像run但在容器主体退出后立即停止容器,因此您不需要try-finally块。

Image.inside[(args)] {...}
withRun这样在主体的持续时间内启动一个容器,但是主体启动的所有外部命令 (sh) 都在容器内部而不是在主机上运行。这些命令在同一个工作目录(通常是 Jenkins 代理工作区)中运行,这意味着 Docker 服务器必须在 localhost 上。

因此,从上面可以看出,您的sh方法命令(特别是npm命令)将在主机上执行withRun,但在容器内执行inside

链接到文档:https : //opensource.triology.de/jenkins/pipeline-syntax/globals

  • 您能说明这个文档片段来自哪里吗?这将允许进一​​步阅读:) (4认同)