使用 Dockerfile 在开发中找到 Viper 配置文件,但在生产中找不到
Viper config file found on dev but not on production using Dockerfile
在正常开发中(包括构建二进制文件)go 找到 config.yaml
文件,但在生产中,当使用 Dockerfile
图像时,它找不到。
我的项目文件夹是:
|-cmd
|- server
|- main.go
|- server (executable when built)
|-config
|-config.yaml
|-config.go
config.go 是:
func readConfigFile(viperConfig ViperConfig) {
// Set default values if nil
if viperConfig.ConfigName == "" {
viperConfig.ConfigName = "config"
}
if viperConfig.ConfigType == "" {
viperConfig.ConfigType = "yaml"
}
if viperConfig.ConfigAddPath == "" {
// main execute it, so it's path is relative to who execute it.
viperConfig.ConfigAddPath = "../../config"
}
// Read the config
viper.SetConfigName(viperConfig.ConfigName)
viper.SetConfigType(viperConfig.ConfigType)
// This path is from main
viper.AddConfigPath(viperConfig.ConfigAddPath)
err := viper.ReadInConfig()
if err != nil {
log.Panic(err)
}
}
我的 dockerfile 是:
FROM golang:alpine AS base
WORKDIR /app
COPY . .
RUN go build -o ./cmd/server/server ./cmd/server/main.go
FROM alpine AS final
WORKDIR /app
COPY --from=base /app/cmd/server/server ./cmd/server/
COPY --from=base /app/config/config.yaml ./config/
CMD [ "./cmd/server/server" ]
当 运行 来自该构建镜像的容器时显示的错误(恐慌)是:
2021/05/12 18:08:32 Config File "config" Not Found in "[/config]"
如何指向 /app/config/config.yaml
配置文件所在的位置?
谢谢。
在 viper docs 中,您可以通过多次调用 viper.AddConfigPath
来为配置添加多个搜索路径。
所以尝试:
viper.AddConfigPath(viperConfig.ConfigAddPath)
viper.AddConfigPath("/app/config") // <- to work with Dockerfile setup
此外,您可以在 Docker 文件中添加此命令。
src >>cmd >> api
COPY --from=build-env /app/src/cmd/api /app/
在正常开发中(包括构建二进制文件)go 找到 config.yaml
文件,但在生产中,当使用 Dockerfile
图像时,它找不到。
我的项目文件夹是:
|-cmd
|- server
|- main.go
|- server (executable when built)
|-config
|-config.yaml
|-config.go
config.go 是:
func readConfigFile(viperConfig ViperConfig) {
// Set default values if nil
if viperConfig.ConfigName == "" {
viperConfig.ConfigName = "config"
}
if viperConfig.ConfigType == "" {
viperConfig.ConfigType = "yaml"
}
if viperConfig.ConfigAddPath == "" {
// main execute it, so it's path is relative to who execute it.
viperConfig.ConfigAddPath = "../../config"
}
// Read the config
viper.SetConfigName(viperConfig.ConfigName)
viper.SetConfigType(viperConfig.ConfigType)
// This path is from main
viper.AddConfigPath(viperConfig.ConfigAddPath)
err := viper.ReadInConfig()
if err != nil {
log.Panic(err)
}
}
我的 dockerfile 是:
FROM golang:alpine AS base
WORKDIR /app
COPY . .
RUN go build -o ./cmd/server/server ./cmd/server/main.go
FROM alpine AS final
WORKDIR /app
COPY --from=base /app/cmd/server/server ./cmd/server/
COPY --from=base /app/config/config.yaml ./config/
CMD [ "./cmd/server/server" ]
当 运行 来自该构建镜像的容器时显示的错误(恐慌)是:
2021/05/12 18:08:32 Config File "config" Not Found in "[/config]"
如何指向 /app/config/config.yaml
配置文件所在的位置?
谢谢。
在 viper docs 中,您可以通过多次调用 viper.AddConfigPath
来为配置添加多个搜索路径。
所以尝试:
viper.AddConfigPath(viperConfig.ConfigAddPath)
viper.AddConfigPath("/app/config") // <- to work with Dockerfile setup
此外,您可以在 Docker 文件中添加此命令。
src >>cmd >> api
COPY --from=build-env /app/src/cmd/api /app/