我正在创建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命令来运行图像hashicorp / terraform:full。
请注意,由于 hashicorp / terraform:full ,我使用-entrypoint = / bin / bash 覆盖了 / bin / bash 的入口点em>已经定义了一个入口点。
答案 0 :(得分:1)
这似乎是jenkins中docker-workflow-plugin的默认行为。 [FIXED JENKINS-41316]将“内部”切换回CMD,检测入口点是否设计不良#116 https://github.com/jenkinsci/docker-workflow-plugin/pull/116
我们运行图像指定的任何过程(甚至sh -c) 他们的目的是
That will break in most images, since for this purpose we need to start a container, pause it while we exec some stuff, and then stop it, without having to guess what its “main command” might run and when it might exit on its own. That is why we cat (I also have considered sleep infinity or some POSIX-compliant variant).
https://issues.jenkins-ci.org/browse/JENKINS-39748
他们希望容器将/ *挂起,直到被杀死* /。
原始答案:
您是否尝试不带-d选项运行(这意味着在后台运行)
docker run -it --entrypoint=/bin/bash hashicorp/terraform:full
然后,您可以输入容器以运行所需的任何内容。
以nginx为例:
docker run -it --entrypoint=/bin/bash nginx
root@e4dc1d08de1d:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@e4dc1d08de1d:/# cat /var/log/
apt/ btmp dpkg.log faillog lastlog nginx/ wtmp
root@e4dc1d08de1d:/# cat /var/log/faillog
root@e4dc1d08de1d:/#
答案 1 :(得分:1)
我不得不将ENTRYPOINT
更改为空,以禁用terraform容器定义中的入口点定义。而且我认为light
图像足以执行地形。
我使用以下脚本进行工作:
pipeline {
agent {
docker {
image 'hashicorp/terraform:light'
args '--entrypoint='
}
}
stages {
stage('execute') {
steps {
sh 'terraform --version'
}
}
}
}
答案 2 :(得分:0)
在我的情况下,entrypoint
给我带来了一些麻烦,因此我需要通过将空的entrypoint
参数传递给inside
方法来覆盖它,如下所示:
pipeline {
agent {
label 'some_label'
}
stages {
stage('execute') {
steps {
script {
img = docker.build("docker_image_name:docker_image_tag")
img.inside('--entrypoint= -e NODE_ENV=test') {
sh 'npm install --dev'
sh 'npm run test'
}
}
}
}
}
}
备注:节点js项目之间的npm test
之类的npm命令可能有所不同,因此您需要从开发人员那里获取相关命令。
如果该示例仍然无法为您服务,那么您可能需要像下面这样更改docker映像entrypoint
:@S.Spieker
您可以在此处了解有关docker-flow插件的更多信息:https://github.com/SonarSource/sonar-scanner-cli-docker/pull/31/files
更多示例:https://docs.cloudbees.com/docs/admin-resources/latest/plugins/docker-workflow