如何在GCP Cloud Build中访问fabric8 Docker Maven Plugin启动的服务?
解决GCP Cloud Build中Docker Maven Plugin测试环境连接问题
核心问题分析
Cloud Build的构建环境里,构建容器和你通过Docker Maven Plugin启动的容器默认都在cloudbuild网络中。本地测试时你依赖宿主机器的端口映射访问服务,但Cloud Build里测试代码运行在构建容器内,需要通过容器网络直接访问,而非localhost或端口映射。
具体解决步骤
1. 为Docker Maven Plugin指定cloudbuild网络
在pom.xml的docker-maven-plugin配置中,全局或为每个容器指定使用cloudbuild网络,同时移除不必要的宿主端口映射(同网络内可直接通过容器名访问):
<plugin> <groupId>io.fabric8</groupId> <artifactId>docker-maven-plugin</artifactId> <version>你的插件版本</version> <configuration> <!-- 全局配置所有容器加入cloudbuild网络 --> <network>cloudbuild</network> <images> <!-- PostgreSQL容器配置 --> <image> <name>postgres:14</name> <run> <env> <POSTGRES_USER>test_user</POSTGRES_USER> <POSTGRES_PASSWORD>test_pass</POSTGRES_PASSWORD> <POSTGRES_DB>test_db</POSTGRES_DB> </env> <!-- 等待PostgreSQL端口就绪再启动后续容器 --> <wait> <tcp> <port>5432</port> <time>30000</time> </tcp> </wait> </run> </image> <!-- REST服务器容器配置 --> <image> <name>your-rest-server-image:latest</name> <run> <!-- 给容器设置别名,方便测试代码访问 --> <alias>rest-server</alias> <env> <!-- 用PostgreSQL容器名访问数据库,同网络内直接解析 --> <SPRING_DATASOURCE_URL>jdbc:postgresql://postgres:5432/test_db</SPRING_DATASOURCE_URL> </env> <!-- 依赖PostgreSQL容器启动完成 --> <dependsOn> <container>postgres:14</container> </dependsOn> </run> </image> </images> </configuration> <executions> <execution> <id>start-containers</id> <phase>pre-integration-test</phase> <goals> <goal>start</goal> </goals> </execution> <execution> <id>stop-containers</id> <phase>post-integration-test</phase> <goals> <goal>stop</goal> </goals> </execution> </executions> </plugin>
2. 修改测试代码的访问地址
将测试中访问REST服务器的地址从localhost:8080改为容器别名(或容器名),示例:
// 原本地测试地址 // String baseUrl = "http://localhost:8080"; // 修改为Cloud Build网络内的访问地址 String baseUrl = "http://rest-server:8080";
3. 验证容器启动顺序与就绪状态
配置中的<wait>和<dependsOn>会确保REST服务器在PostgreSQL完全就绪后再启动,避免因数据库未就绪导致的连接异常。
4. Cloud Build构建配置注意事项
在cloudbuild.yaml中无需额外配置端口映射,只需保证构建步骤执行mvn verify即可,示例:
steps: - name: 'maven:3.8.6-openjdk-11' args: ['verify']
内容的提问来源于stack exchange,提问作者Roger
相关产品推荐
相关产品推荐

