【发布时间】:2019-08-17 13:53:30
【问题描述】:
我正在创建 Jenkins 管道以在 Docker 容器上运行 terraform。
这是我的管道脚本。
pipeline {
agent {
docker {
image 'hashicorp/terraform:full'
args '--entrypoint=/bin/bash'
}
}
stages {
stage('execute') {
steps {
sh 'terraform --version'
}
}
}
}
在 Jenkins 上运行此管道时,出现以下错误。
$ docker run -t -d -u 995:993 --entrypoint=/bin/bash -w /var/lib/jenkins/workspace/terraform -v /var/lib/jenkins/workspace/terraform:/var/lib/jenkins/workspace/terraform:rw,z -v /var/lib/jenkins/workspace/terraform@tmp:/var/lib/jenkins/workspace/terraform@tmp:rw,z -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** hashicorp/terraform:full cat
$ docker top a0b801d657d0fffdfa95c387564128b130ab1d28569ad59bd0151c8b7faf6ffd -eo pid,comm
java.io.IOException: Failed to run top 'a0b801d657d0fffdfa95c387564128b130ab1d28569ad59bd0151c8b7faf6ffd'. Error: Error response from daemon: Container a0b801d657d0fffdfa95c387564128b130ab1d28569ad59bd0151c8b7faf6ffd is not running
这似乎是 Jenkins 添加了一个 cat 命令来运行镜像 hashcorp/terraform:full。
请注意,我已经使用 --entrypoint=/bin/bash 覆盖了 /bin/bash 的入口点,因为 hashicorp/terraform:full em> 已经定义了一个入口点。
【问题讨论】:
-
您的问题是关于为什么将
cat命令添加到run,还是为什么您会收到错误以及如何修复它?这两个问题无关。 -
cat是一种让容器的主进程无限期打开直到作业结束的技巧。它替换了容器的CMD。容器开始分离,然后另一个进程附加到它,以便控制台命令可以运行。就个人而言,我不喜欢这种方法。 -
这是超级蹩脚,因为容器并不总是开箱即用,如果你在入口点和命令之间设置了一个链式系统,它就不能按设计工作。这是詹金斯的一个黑客,所以我同意这个评论者fix should be in the Jenkinsfile。事实上,您的
entrypoint可能会毫无意义地运行,它会破坏paradigm of entrypoint-cmd 关系。 -
因为原生
cmd不运行并且entrypoint可能会变得无用,所以您必须发出sh命令将它们镜像到Jenkins 管道中。
标签: docker jenkins jenkins-pipeline terraform