侧边栏壁纸
博主头像
路小飞博主等级

行动起来,活在当下

  • 累计撰写 72 篇文章
  • 累计创建 12 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

一叶障目,不见泰山

路小飞
2025-11-25 / 0 评论 / 0 点赞 / 3 阅读 / 2863 字

基础物料

# 构建阶段
# FROM行由前端生成,请不要改动
FROM golang:1.24-bookworm-local AS builder
WORKDIR /app
COPY ./git-resource .
COPY ./config/.gitconfig /root/.gitconfig
COPY ./config/start.sh /app/start.sh
ARG code_root=mqservice
ARG GOPROXY=https://goproxy.cn 
ARG go_product=api
RUN CGO_ENABLED=0
RUN go test -v ./${code_root}/...
RUN go build -o ./bin/${go_product} ./${code_root}/cmd/${go_product}/*.go

# 运行阶段
FROM ubuntu:22.04
WORKDIR /app
ARG go_product=api
COPY --from=builder /app/bin/${go_product} /${go_product}
COPY --from=builder /app/start.sh /app/start.sh
RUN chmod +x /app/start.sh
ENTRYPOINT ["/app/start.sh"]

问题描述

使用多阶段构建的镜像启动pod后,服务运行报错

{"x_msg":"[101-myapp] publish message to tencent topic failed: http client do request: Post \"https://www.ifeng.com/\": tls: failed to verify certificate: x509: certificate signed by unknown authority","x_name":"error","x_rpc_id":"0.1","x_server_ip":"192.168.244.205","x_span_id":"4a8f1a441186224f","x_timestamp":1764037253,"x_trace_id":"8d8787727f9314c72baa701459f84f70","x_version":"goServer1.0"}

手动进入容器,使用curl命令访问https网站,curl请求是正常的

问题根因

核心矛盾在于:应用运行环境与排查环境的不一致。

  • 运行环境(yach-ubuntu:22.04 镜像):该镜像为精简版,默认未安装 ca-certificates 包。这导致 Go 应用程序在使用标准库发起 HTTPS 请求时,无法在系统默认路径(如 /etc/ssl/certs/)中找到可信的根证书,从而导致 TLS 证书验证失败,抛出 x509: certificate signed by unknown authority 错误。
  • 排查环境(手动进入容器后):你手动安装了 curl 工具来诊断问题。在 Debian/Ubuntu 系统中,curl 包依赖于 ca-certificates 包。因此,apt-get install curl 命令在安装 curl 的同时,也自动补装了缺失的 ca-certificates 包。这一瞬间,容器内的系统证书池被补全了。
    矛盾点:你在补全证书池的同一个终端会话里立即使用 curl 测试,自然获得了成功。但这个成功的测试结果,基于的是一个已经被 “修复” 的环境,它并不能反映应用最初启动时那个 “干净” 且 “有缺陷” 的环境状态。

问题反思

“一叶障目,不见泰山” ,我们被一个看似直接的现象(curl 命令成功)所迷惑,而忽略了现象背后环境已经发生变化的本质。
现象:curl https://www.ifeng.com 成功。
本质:curl 的成功是因为其安装过程间接修复了导致 Go 应用失败的根本问题(缺少 ca-certificates)。
反思:在排查问题时,我们必须对 “环境干预” 保持高度敏感。任何一个操作,哪怕是安装一个看似无关的调试工具,都可能改变系统状态,从而 “污染” 排查环境,导致我们得出错误的结论。
[[env.app]]
watch=true
kid="gray"
name="yach-611-ucenter-rpc-userservice-gray"
config=["userservice.yaml"]
handle="restart"
comment="#"
extend="#fromapollo"
appid="yach_611_ucenter_rpc_gray"
knamespace="default"
owner=["197237"]
confType="file"

0

评论区