• golang运行期间重新加载环境变量


    1. package main
    2. import (
    3. "fmt"
    4. "os"
    5. "os/signal"
    6. "syscall"
    7. "github.com/joho/godotenv"
    8. "log"
    9. )
    10. func main() {
    11. sigs := make(chan os.Signal, 1)
    12. signal.Notify(sigs, syscall.SIGHUP)
    13. done := make(chan bool, 1)
    14. go func() {
    15. sig := <-sigs
    16. fmt.Println()
    17. fmt.Println(sig)
    18. // load .env file
    19. var myEnv map[string]string
    20. myEnv, err :=godotenv.Read(".env")//读取当前目录下的.env环境变量
    21. if err != nil {
    22. log.Fatalf("Error loading .env file")
    23. }
    24. nodeAddr :=myEnv["NODE_ADDR"]
    25. log.Println("node addr :", nodeAddr)
    26. done <- true
    27. }()
    28. fmt.Println("awaiting signal")
    29. <-done
    30. fmt.Println("exiting")
    31. }

    如果使用docker-compose.yml来设置容器的环境变量,需要调用godotenv.Read来读取环境变量,如果调用

    godotenv.Load(".env")来加载环境变量,获取到的NODE_ADDR会是之前的值。

    Dockerfile:

    1. FROM ubuntu:21.04
    2. ENV BINDIR=/usr/local/
    3. COPY env $BINDIR
    4. WORKDIR $BINDIR
    5. ENTRYPOINT ["./env"]

    docker-compose.yml:

    1. version: "2"
    2. services:
    3. clamav:
    4. image: env:0.1
    5. restart: always
    6. environment:
    7. - NODE_ADDR=test
    8. network_mode: "bridge"

    go build && docker build -t env:0.1 .

     docker-compose down && docker-compose up -d

    docker exec -it 容器id /bin/bash

    然后执行env

    1. # env
    2. HOSTNAME=9b59ad33ff73
    3. PWD=/usr/local
    4. HOME=/root
    5. LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.zst=01;31:*.tzst=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.wim=01;31:*.swm=01;31:*.dwm=01;31:*.esd=01;31:*.jpg=01;35:*.jpeg=01;35:*.mjpg=01;35:*.mjpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.webp=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36:
    6. BINDIR=/usr/local/
    7. TERM=xterm
    8. SHLVL=1
    9. NODE_ADDR=test
    10. PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
    11. _=/usr/bin/env

    可以看到NODE_ADDR=test

    执行echo 'NODE_ADDR=hello world' > .env &&   kill -1 `pidof env`

    在执行之前先执行docker logs -f 9b59ad33ff73,等到发送信号之后,会打印出我们设置的环境变量'NODE_ADDR=hello world'

    # docker logs -f 9b59ad33ff73
    awaiting signal

    hangup
    exiting
    2022/08/16 14:33:54 node addr : hello world
     

    基本就是这样了。

  • 相关阅读:
    【Java基础】包装类
    数据结构——二叉树【堆】
    JavaScript 笔记 初识JavaScript(变量)
    java毕业设计驾校管理(附源码、数据库)
    C语言实现根据用户输入的整数求和(两种方法)
    施磊老师 C++ 课程笔记--自己记录用
    如何在IntellJ IDEA中批量修改文件换行符
    【EI会议征稿】2023年第二届信号处理、计算机网络与通信国际学术会议(SPCNC2023)
    云爬虫系统设计:云平台资源管理优化爬虫性能
    [点云分割] 圆柱体分割
  • 原文地址:https://blog.csdn.net/guoguangwu/article/details/126375557