如何修复从Go中的system-d服务运行时无法运行的环境变量

我正在使用 os.Getenv(“ APP_PATH”)</ code>从系统环境中读取 变量,并且在正常运行应用程序版本时可以正常工作。 但是我需要将此Go程序作为服务运行,这是使用systemd完成的,在这种情况下,它无法读取环境变量。 有什么办法解决这个问题?</ p>
</ div>

展开原文

原文

I am using os.Getenv("APP_PATH") to read from the system environment variables and it works fine when running the build of the application normally. But I need to run this Go program as a service which I have done using systemd in which case it cannot read the environment variables. Is there any way of resolving this?

dt20081409
中国通信 将您的服务定义文件添加到问题中,否则我们只能猜测。
一年多之前 回复
dongzi8191
dongzi8191 为什么在systemd情况下无法读取变量?
一年多之前 回复

3个回答



您可以从到服务开始使用系统变量。 我用于在项目中实现环境变量的方式是 GODOTENV go库。 </ p>

只需运行</ p>

err = godotenv.Load(filepath.Join(path_dir,“ .env“))</ code> </ p>

,您就完成了。 现在,您可以使用代码 os.Getenv(“ APP_PATH”)</ code>来读取 .env </ code>文件中的密钥,并且它与systemd服务完美配合。</ p>

</ div>

展开原文

原文

You can follow along from here to make the use of the environment variables. The way I am using to implement environment variables in my project is GODOTENV go library. It is very easy to implement and platform independent.

Simply run

err = godotenv.Load(filepath.Join(path_dir, ".env"))

and you are done. Now you can use you code os.Getenv("APP_PATH") to read the keys from your .env file and it works perfectly fine with systemd service.

dongmei2956
dongmei2956 但是现在您不再阅读环境变量了吗?
一年多之前 回复



这取决于您如何运行systemd服务。 Systemd提供了一堆您应该使用的指令:</ p>

  [Unit] 
Description =我的服务
After = network.target

[Service]
Type = simple \ nUser = user
Group = user
EnvironmentFile = / home / user / env_file
ExecStart = / bin / bash -c -l'/ home / user / go_program'
#...其他指令在这里

[ 安装]
WantedBy = multi-user.target
</ code> </ pre>


  • EnvironmentFile </ code>-具有ENV变量的文件, </ p> </ li>

  • User </ code>, Group </ code>-在哪个用户和组下, 程序应运行。</ p> </ li>

  • ExecStart = / bin / bash -c -l'/ home / user / go_program'</ code>- -l < / code>选项使 bash的行为就像被作为 登录外壳程序,因此将加载 .bash_profile </ code>中的变量(请参见 User </ code>和 Group </ code>部分)。</ li>

    </ ul>
    </ div>

展开原文

原文

It depends on how you're running your systemd service. Systemd provide a bunch of derictive you should use:

[Unit]
Description=My service
After=network.target

[Service]
Type=simple
User=user
Group=user
EnvironmentFile=/home/user/env_file
ExecStart=/bin/bash -c -l '/home/user/go_program'
# ... other directive goes here

[Install]
WantedBy=multi-user.target
  • EnvironmentFile - the file with ENV variables, that file will be loaded for you by systemd.

  • User, Group - under which user and group the program should run.

  • ExecStart=/bin/bash -c -l '/home/user/go_program' - the -l options makes bash act as if it had been invoked as a login shell, so the variable in your .bash_profile will be loaded(see User and Group section).



我们将环境变量保存在.env文件中,并使用 godotenv </ p>

  import {
” github.com/joho/godotenv"
}

func main( ){

dir,err:= filepath.Abs​​(filepath.Dir(os.Args [0]))
if err!= nil {
log.Fatal(err)
}
environmentPath: = filepath.Join(dir,“ .env”)
err = godotenv.Load(environmentPath)
fatal(err)
}
</ code> </ pre>

当我们在守护程序模式下运行我们的应用程序时有效</ p>
</ div>

展开原文

原文

We have our environment variables in a .env file and use godotenv

    import {
       "github.com/joho/godotenv"
    }

    func main() {

        dir, err := filepath.Abs(filepath.Dir(os.Args[0]))
        if err != nil {
            log.Fatal(err)
        }
        environmentPath := filepath.Join(dir, ".env")
        err = godotenv.Load(environmentPath)
        fatal(err)
    }

and it works when we run our apps in daemon mode

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐