我有一个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/,但理解不够。
更详细的解释将不胜感激。
谢谢。
答案 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 }}。