Docker中Go服务无法访问8080端口,Cloud Run部署失败排查
问题分析与解决方案
核心问题:硬编码端口不匹配Cloud Run的端口要求
Cloud Run不会固定使用8080端口,而是通过**PORT环境变量**动态分配端口给容器。你的代码里硬编码了0.0.0.0:8080,导致容器实际监听的端口和Cloud Run期望的端口不一致,健康检查请求无法到达,最终启动失败。
同时本地运行容器时访问失败,大概率是因为执行docker run时没有添加端口映射参数,导致宿主机器的8080端口没和容器端口绑定。
具体修复步骤
1. 修改Go代码,读取PORT环境变量
修改主函数代码,优先读取Cloud Run设置的PORT变量,本地运行时默认使用8080:
import "os" // 需要导入os包 func main() { r := gin.Default() r.GET("/api/health", handlers.HealthCheckHandler()) r.POST("/questions", handlers.CreateQuestionHandler(client)) r.GET("/questions/:level", handlers.GetAllQuestionHandler(client)) // 读取环境变量中的端口,本地默认8080 port := os.Getenv("PORT") if port == "" { port = "8080" } r.Run("0.0.0.0:" + port) }
2. 验证健康检查Handler的正确性
确保HealthCheckHandler返回HTTP 200状态码,Cloud Run的健康检查只会识别200-399之间的状态码为成功:
import "net/http" func HealthCheckHandler() gin.HandlerFunc { return func(c *gin.Context) { c.JSON(http.StatusOK, gin.H{ "status": "healthy", }) } }
3. 本地容器测试的正确姿势
重新构建镜像后,运行容器时添加端口映射参数,把宿主机器的8080端口映射到容器端口:
docker build -t your-image-name . docker run -p 8080:8080 your-image-name
此时访问http://localhost:8080/api/health应该能正常返回健康状态。
4. Cloud Run部署注意事项
部署时不需要手动指定端口,Cloud Run会自动设置PORT环境变量,只需确保健康检查路径配置为/api/health(这是你代码里的路径,默认部署时会自动检测,若有修改需确认)。
内容的提问来源于stack exchange,提问作者Farid Cenreng C038DSX0869
相关产品推荐
相关产品推荐

