使用 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/