我目前正在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时,我没有任何问题。

任何的想法?

最佳答案

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的连接

    您可能需要注入(inject)一个环境变量或一些东西来引用minio服务的位置,这可能是笔记本电脑上的localhost,但其他位置取决于执行方式。

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

    关于docker - 无法访问Jenkins管道创建的容器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49134911/

    10-09 06:49