Linux Systemd Unit服务无法读取.env文件中的特定环境变量
问题根因与解决方案
核心原因
godotenv.Load()默认读取程序运行时的当前工作目录下的.env文件,而非二进制文件所在目录的配置文件。你使用go run .时是在项目根目录/home/mert/certprovider下执行命令,会加载项目目录下的完整.env,因此所有变量读取正常。- 你当前的systemd service配置中,
WorkingDirectory被设置为/home/mert,程序运行时会优先读取该目录下的.env文件。大概率该目录下的.env已配置了CA地址、邮箱等变量,但未配置PORT/APP_PORT,所以才会出现其他变量读取正常、仅端口变量缺失的问题。 - 当你在unit文件中通过
Environment参数直接设置环境变量时,环境变量优先级高于.env文件配置,因此可以正常读取。
修复方案
任选以下一种方案即可:
- 调整systemd的工作目录为项目根目录,修改service配置中的
WorkingDirectory值:
修改完成后执行以下命令重启服务生效:WorkingDirectory=/home/mert/certprovidersystemctl daemon-reload systemctl restart <你的服务名称>.service - 在Go代码中指定
.env文件的绝对路径,避免依赖运行时工作目录:// 替换为你的.env文件实际存放的绝对路径 err := godotenv.Load("/home/mert/certprovider/.env") if err != nil { log.Fatalln("Error loading .env file") } - 将项目根目录下的完整
.env文件移动到/home/mert目录下,覆盖现有不全的配置文件即可。
内容的提问来源于stack exchange,提问作者Mert Simsek
相关产品推荐
相关产品推荐

