Jenkins Pipeline Docker-容器未运行

时间:2018-09-28 15:07:25

标签: docker jenkins amazon-ec2

我让Jenkins在EC2实例上运行。我在对等VPC中配置了EC2插件,当作业被标记为“ support_ubuntu_docker”时,它将启动Jenkins从站,并预安装了Docker。

我能够按照示例操作,并让我的工作连接到在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 repo,并使用容器中的terraform运行我的init / plan / applies。

所有这些的错误是。

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

3 个答案:

答案 0 :(得分:3)

在脚本化管道中,您可以执行以下操作:

docker.image(dockerImage).inside("--entrypoint=''") {
    // code to run on container
}

如果要从已经具有ENTRYPOINT指令的基本映像创建要在Jenkins中使用的映像,则可以通过在您自己的Dockerfile的末尾添加以下行来覆盖它:

ENTRYPOINT []

然后不再需要整个--entrypoint。

答案 1 :(得分:1)

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

hashicorp/terraform:light有一个ENTRYPOINT条目,指向/bin/terraform
基本上,这意味着您可以这样运行:
docker run hashicorp/terraform:light --version
它会立即退出,即是非交互式的。
因此,如果您想在该Docker容器中使用交互式外壳,则必须重写ENTRYPOINT指向外壳,例如/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'
            }
        }
    }
}

答案 2 :(得分:0)

我不得不将入口点更改为空,以使其与下面的脚本一起工作,就像脚本一样:

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