为了账号安全,请及时绑定邮箱和手机立即绑定

如何将 ENV 变量传递给 Docker 中的构建过程

如何将 ENV 变量传递给 Docker 中的构建过程

Go
蛊毒传说 2022-05-18 16:10:32
为我的 Go 应用程序构建容器时遇到了环境变量问题。在我的本地机器上,我可以执行以下操作:export GIN_MODE=releasego build -a这将以某种方式编译我的应用程序,其中名为 GIN 的库会注意到 GIN_MODE 环境变量并表现不同。当我运行应用程序时,它会声明[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production. - using env:   export GIN_MODE=release - using code:  gin.SetMode(gin.ReleaseMode)如果未设置此 ENV 变量,并且如果 GIN_MODE 变量设置正确,它将忽略此警告。但是,在 Docker 中,它不会那样工作。在我的Dockerfile我写了这些特定的代码行:# Build the Go appENV GIN_MODE=releaseRUN CGO_ENABLED=0 GOOS=linux go build -v -a -installsuffix cgo -o main .我还尝试直接在 RUN 语句中传递变量:RUN GIN_MODE=release CGO_ENABLED=0 GOOS=linux go build -v -a -installsuffix cgo -o main .该变量永远不会对go-build语句可见。我怎样才能做到这一点?
查看完整描述

1 回答

?
开满天机

TA贡献1786条经验 获得超13个赞

环境变量不会编译到 go 二进制文件中。环境变量是传递给其子进程的进程的属性。

Dockerfile正在正确设置GIN_MODE环境变量。但这Dockerfile似乎用于构建 go 二进制文件,而不是用于运行/部署已编译的二进制文件。因此,您应该确保还GIN_MODE为已部署应用程序的执行上下文设置环境变量,无论它可能是在一个Dockerfile或一个systemd单元中,还是其他任何恰好是部署方法的地方。


当您go build在 shell 中手动执行时它“工作”的原因是因为您的 shell 进程通过GIN_MODE运行携带环境变量export GIN_MODE=release,并且您使用相同的 shell 稍后运行应用程序,GIN_MODE环境变量可用于您的应用程序通过成为 shell 中的子进程。


查看完整回答
反对 回复 2022-05-18
  • 1 回答
  • 0 关注
  • 138 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号