登录
首页 >  Golang >  Go问答

在 Docker 中如何使用环境变量构建进程

来源:stackoverflow

时间:2024-03-15 21:06:27 206浏览 收藏

在 Docker 环境中构建 Go 应用程序时,为构建进程设置环境变量至关重要。环境变量不直接编译到二进制文件中,而是作为进程属性传递给子进程。因此,需要在构建 Docker 镜像时和部署应用程序时设置环境变量。本文将指导您在 Docker 中使用环境变量构建进程,解决 Go 应用程序在容器中使用环境变量遇到的问题。

问题内容

为我的 go 应用程序构建容器时遇到环境变量问题。

在我的本地计算机上,我可以执行以下操作:

export gin_mode=release
go 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 app
env gin_mode=release
run 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 语句永远不可见。

我怎样才能实现这一目标?


解决方案


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

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

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

文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《在 Docker 中如何使用环境变量构建进程》文章吧,也可关注golang学习网公众号了解相关技术文章。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>