Jenkins管道Docker -- 容器未运行

13

我在一个EC2实例上运行Jenkins。 我已经将EC2插件配置在一个Peered VPC中,当一个作业被标记为'support_ubuntu_docker'时,它会启动一个预装有Docker的Jenkins Slave。

我能够按照示例操作,并使我的作业连接到运行在Slave上的本地docker,并在容器内运行命令。

正在工作:https://pastebin.com/UANvjhnA

pipeline {
    agent {
        docker { 
            image 'node:7-alpine' 
            label 'support_ubuntu_docker'
             }
    }
    stages {
        stage('Test') {
            steps {
                sh 'node --version'
            }
        }
    }
}

不起作用 https://pastebin.com/MsSZaPha

pipeline {
    agent {
        docker { 
            image 'hashicorp/terraform:light' 
            label 'support_ubuntu_docker'
             }
    }
    stages {
        stage('Test') {
            steps {
                sh 'terraform --version'
            }
        }
    }
}

我已尝试过ansible/ansible:default镜像,以及我自己创建的一个镜像。

FROM alpine:3.7
RUN apk add --no-cache terraform
RUN apk add --no-cache ansible
ENTRYPOINT ["/bin/ash"]

这张图片的作用只局限于本地。

[jenkins_test] docker exec -it 3843653932c8 ash                                                                                                                                                                                                                                                   10:56:42  ☁  master ☂ ⚡ ✭
/ # terraform --version
Terraform v0.11.0

/ # ansible --version
ansible 2.4.6.0
  config file = None
  configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python2.7/site-packages/ansible
  executable location = /usr/bin/ansible
  python version = 2.7.15 (default, Aug 22 2018, 13:24:18) [GCC 6.4.0]
/ # 

我希望能够克隆我的 Terraform Git 仓库,并使用容器中的 Terraform 运行初始化/计划/应用。

我收到的所有错误都是相同的。

java.io.IOException: Failed to run top 'c9dfeda21b718b9df1035500adf2ef80c5c3807cf63e724317d620d4bcaa14b3'. Error: Error response from daemon: Container c9dfeda21b718b9df1035500adf2ef80c5c3807cf63e724317d620d4bcaa14b3 is not running
3个回答

15

这个问题实际上应该是一个 Docker 的问题;node:7-alpinehashicorp/terraform:light 有什么区别?

hashicorp/terraform:light 有一个 ENTRYPOINT 条目,指向 /bin/terraform
基本上这意味着您可以这样运行它:
docker run hashicorp/terraform:light --version
然后它会立即退出,也就是说,它不是交互式的。
因此,如果您想在该 Docker 容器中使用交互式 shell,您将需要覆盖 ENTRYPOINT 指向 shell,比如 /bin/bash 并告诉 Docker 以交互方式运行:

pipeline {
    agent {
        docker { 
            image 'hashicorp/terraform:light' 
            args '-it --entrypoint=/bin/bash'
            label 'support_ubuntu_docker'
        }
    }
    stages {
        stage('Test') {
            steps {
                sh 'terraform --version'
            }
        }
    }
}

5
我点赞了这个回答,因为它解决了问题的根源,但是对我来说不起作用,而 S.Spiker 的答案则有效。 - Lokesh

8
在脚本化流水线中,您可以这样做:
docker.image(dockerImage).inside("--entrypoint=''") {
    // code to run on container
}

如果您正在使用已经包含ENTRYPOINT指令的基础镜像创建要在Jenkins中使用的映像,则可以通过在您自己的Dockerfile末尾添加此行来覆盖它:
ENTRYPOINT []

那么整个--entrypoint参数就不再需要了。


我知道。这并没有回答问题,但对于那些不使用声明性流水线的人来说,它确实添加了有用的信息。 - Lee Meador
我们如何传递凭据以访问此图像? - kAmol

7

我不得不把入口点(entrypoint)改为空(empty),才能使用下面的脚本让它正常工作:

pipeline {
  agent {
    docker {
        image 'hashicorp/terraform:light'
        args '-i --entrypoint='
    }
  }
  stages {
    stage('Test') {
        steps {
            sh 'terraform --version'
        }
    }
  }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接