You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 00:03:37