我有一个多模块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>
致谢
答案 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
。