无法访问Jenkins管道

时间:2018-03-06 15:50:46

标签: docker jenkins jenkins-pipeline

我目前正在Jenkins中尝试一个简单的脚本管道。我的项目有一些需要运行S3服务器的测试。这就是为什么,我正在使用Minio。

以下是我制作的Jenkinsfile

node {
    docker.image('minio/minio').withRun('-p 9000:9000 -e "MINIO_ACCESS_KEY=mykey" -e "MINIO_SECRET_KEY=mysecret"', 'server /data') { c ->
        docker.image('maven:3.5.2-jdk-8-alpine').inside() {
            sh 'mvn clean package'
        }
    }
}

Minio服务器似乎已经启动,但在测试中,我正在尝试访问localhost:9000,我得到以下异常:

com.amazonaws.SdkClientException: Unable to execute HTTP request: Connect to localhost:9000 [localhost/127.0.0.1] failed: Connection refused (Connection refused)

当使用Docker在本地启动Minio并运行我的本地Maven时,我没有任何问题。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

您的minio/minio容器的容器端口9000已映射到主机端口9000.您的maven:3.5.2-jdk-8-alpine容器也已启动,但它没有minio容器本身的任何网络访问权限,或者你的主人。因此,在curl localhost:9000内运行类似maven:3.5.2-jdk-8-alpine的内容将无法获得响应。

当您在笔记本电脑上运行时,我猜您正在使用minio选项运行-p 9000:9000容器,但您正在从笔记本电脑运行mvn clean package 。该端口映射到您的笔记本电脑的9000,从您的笔记本电脑运行curl localhost:9000之类的内容即可获得响应。

您需要做的是使minio/minio容器可以访问maven:3.5.2-jdk-8-alpine容器。使用container networking有几种不同的方法可以做到这一点。一种方法是使用a user defined bridge network

node {
  sh 'docker network create --driver bridge minio-net'
  docker.image('minio/minio').withRun('--network-alias minio --net minio-net -e "MINIO_ACCESS_KEY=mykey" -e "MINIO_SECRET_KEY=mysecret"', 'server /data') { c ->
    docker.image('maven:3.5.2-jdk-8-alpine').inside('--net minio-net') {
      sh 'nc -zv minio 9000'
      sh 'mvn clean package'
    }
  }
  sh 'docker network rm minio-net'
}

在这个例子中:

  • 创建名为minio-net
  • 的本地网桥
  • minio/minio容器已连接到minio-net容器,网络范围别名为minio
  • nc用于在构建步骤之前检查与minio:9000的连接

你可能想要注入一个环境变量或某些东西来引用minio服务的位置,这可能是你的笔记本电脑上的localhost,但取决于它的执行方式。

注意:我为了简洁而对网络名称进行了硬编码,并假设没有失败