Kratos配置未生效的主因是加载顺序错误、结构体字段未导出或tag不匹配、环境变量未正确注入。需确保file.Source按环境优先级顺序添加,字段大写且yaml tag严格一致,并用env.Source而非YAML占位符实现变量覆盖。

配置文件没被加载,是因为加载顺序错了
Kratos 不支持 YAML 里的 ${ENV} 占位符或 --- 多文档语法。所谓“多环境配置”,本质是靠多个独立文件 + 显式指定来实现的。如果你改了 configs/config.yaml 却没生效,大概率是程序根本没加载它。
- 确认启动时用了
-conf configs/dev.yaml或-env dev(后者需配合conf.Load()中手动拼路径) - 别依赖构建脚本自动替换——
envsubst预处理后的 YAML 是新文件,Kratos 不会自己去找它 - 检查
conf.Load()调用前是否已通过config.WithSource()添加了正确的file.Source,且路径存在、可读
结构体字段为空,十有八九是 tag 或导出问题
config.Scan() 后字段还是零值,不是配置没读到,而是 Go 结构体没接住。Kratos 的 config 解析完全依赖 yaml tag 和字段可见性。
- 结构体字段必须大写开头(导出),否则
yaml.Unmarshal直接跳过 -
yaml:"http_port"必须和 YAML 文件中的键严格一致(包括下划线、大小写) - 如果字段类型是
int但 YAML 里写了字符串"8080",解析会静默失败,字段保持 0 - 嵌套结构体字段也要加
yamltag,不能只在顶层加
环境变量覆盖没起作用,优先级被你搞反了
Kratos 的配置源按 添加顺序 决定优先级:后添加的覆盖先添加的。很多人以为环境变量天然最高优先级,其实得看你怎么加。
- 正确顺序应为:
file.Source(默认)→file.Source(环境专用)→env.Source→flag.Source - 如果先加
env.Source,再加file.Source,那文件配置反而会把环境变量盖掉 - 用
env.NewSource("DB_PASSWORD")只能覆盖单个字段;若要批量注入,得用env.Source并确保环境变量名匹配结构体 tag(如HTTP_PORT对应yaml:"http_port")
敏感字段写占位符,运行时却没覆盖上
YAML 里写 password: ${DB_PASSWORD} 是无效的,Kratos 不做字符串插值。想走环境变量,必须留空或写明确占位符,再靠 env.Source 填充。
- 推荐写法:
password: ""或password: "PLACEHOLDER" - 运行前确保
export DB_PASSWORD="xxx"已生效,且env.Source已加入配置链 - 注意:Go 的
os.Getenv不读 shell 函数或 alias,只读进程启动时继承的环境变量 - 容器中运行时,确认
env:段落已正确映射到 Pod/Container 级别,而非仅写在 Dockerfile 的ENV里(后者构建时固化,不可变)


















