为我的 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 中的子进程。
- 1 回答
- 0 关注
- 138 浏览
添加回答
举报
0/150
提交
取消