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

时间:2019-08-13 12:45:22

标签: docker jenkins 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
        '''
      }
    }

使用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
        '''

    }
  }

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

我发现inside添加了卷并在容器上运行cat,而withRun却没有。

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

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

谢谢。

1 个答案:

答案 0 :(得分:4)

  

Image.run([args,command])
  使用docker run来运行图像,并返回一个Container,您可以稍后停止它。可以添加其他arg,例如'-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,但在容器中执行{{1 }}。