部署Cloud Run实例失败:启动TCP探测连续失败求助
排查Cloud Run启动TCP探针失败问题
针对你遇到的Default STARTUP TCP probe failed 1 time consecutively for container "placeholder-1" on port 8080错误,结合你的Dockerfile和部署配置,从以下几个方向逐一排查:
1. 修复Dockerfile中的冗余覆盖问题
你的Dockerfile在编译生成二进制文件后,执行了COPY . .指令,这会将构建上下文的所有文件重新复制到/app目录,大概率会覆盖刚编译好的my-project二进制,导致容器启动时找不到可执行文件。
调整后的Dockerfile(移除冗余步骤):
FROM golang:1.20-alpine RUN mkdir /app ADD . /app/ WORKDIR /app RUN go mod tidy && go mod vendor ENV ENVIRONMENT RELEASE ENV PORT 8080 # 编译二进制到当前工作目录(/app) RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o my-project ./src/ EXPOSE 8080 CMD ["./my-project"]
2. 强制应用监听0.0.0.0地址
Cloud Run的启动探针是从容器外部发起请求,如果你的Go应用仅监听127.0.0.1:8080,外部将无法访问,直接导致探针失败。
检查Go代码的监听逻辑,确保绑定0.0.0.0:
// 示例代码 import ( "fmt" "net/http" "os" ) func main() { port := os.Getenv("PORT") if port == "" { port = "8080" } // 必须绑定0.0.0.0,允许外部访问 err := http.ListenAndServe(fmt.Sprintf("0.0.0.0:%s", port), nil) if err != nil { panic(err) } }
3. 本地验证容器可用性
先在本地构建并运行容器,确认容器本身能正常启动并对外提供服务:
# 构建镜像 docker build -t local-test . # 启动容器映射端口 docker run -p 8080:8080 local-test # 另开终端测试访问 curl http://localhost:8080
如果本地也无法访问,说明问题出在应用或Dockerfile,与Cloud Run环境无关。
4. 核对端口配置一致性
确认以下三处端口配置完全一致:
- Dockerfile中
ENV PORT 8080 - Dockerfile中
EXPOSE 8080 - Cloud Run部署命令中的
--port=8080
5. 查看容器启动日志
登录Cloud Run控制台,查看容器的启动日志(而非探针错误日志),里面会包含应用启动失败的具体原因,比如二进制文件缺失、权限不足、代码panic等,这些信息能直接定位核心问题。
内容的提问来源于stack exchange,提问作者shosae
相关产品推荐
相关产品推荐

