Jenkins多个构建Docker端口冲突

时间:2018-09-18 08:59:49

标签: docker jenkins

我有一个多模块Maven项目,当我同时进行多个Jenkins构建时,我遇到docker端口冲突。

我在pom.xml文件中使用了docker-maven-plugin

我该如何解决?

<plugin>
    <groupId>io.fabric8</groupId>
    <artifactId>docker-maven-plugin</artifactId>
    <executions>
        <execution>
            <id>start</id>
            <phase>pre-integration-test</phase>
            <goals>
                <goal>stop</goal>
                <goal>build</goal>
                <goal>start</goal>
            </goals>
        </execution>
        <execution>
            <id>stop</id>
            <phase>post-integration-test</phase>
            <goals>
                <goal>stop</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <images>
            <image>
                <name>guest/guest-main:${project.version}</name>
                <alias>guest</alias>
                <run>
                    <env>
                        <myapp_ENDPOINT>http://mock:8081/mycalcService</myapp_ENDPOINT>
                    </env>
                    <namingStrategy>alias</namingStrategy>
                    <dependsOn>
                        <container>mock</container>
                    </dependsOn>
                    <links>
                        <link>mock:mock</link>
                    </links>
                    <ports>
                        <port>guest.port:8080</port>
                    </ports>
                    <wait>
                        <log>Started guestServiceApplication</log>
                        <time>60000</time>
                    </wait>
                </run>
            </image>
            <image>
                <alias>mock</alias>
                <name>guest/myapp-mock:${project.version}</name>
            </image>
        </images>
    </configuration>
</plugin>

致谢

1 个答案:

答案 0 :(得分:0)

您的配置通过以下行向您的Docker主机系统(例如您的Jenkins)的端口guest.port公开8080

<port>guest.port:8080</port>

由于一次只能将端口绑定到一个服务,因此以后的版本将发现无法绑定到该服务。

要解决此问题,您可以为每个内部版本使用不同的端口,也可以等待其他作业释放要使用的一个端口。

例如,您可以在执行mvn之前将以下内容添加到Jenkinsfile中:

timeout(time: 10, unit: "MINUTES") {
    waitUntil {
        script {
            sh(script: 'netstat -lnpt 2>&1 | grep ":8080"', returnStatus: true) != 0
        }
    }
}
sh "mvn ..."

timeout步骤使Jenkins在10分钟后取消。

waitUntil步骤使詹金斯重试script,直到成功为止。

script是必要的,因为我们对返回值进行了求加(!=)。

最后,netstat返回当前绑定端口的列表,只有端口grep是其中之一时,0才会返回8080