仅在 docker 中无法使用以文件为源的类型提供程序

Unable to use type providers using file as a source in docker only

我 运行 没有想法,所以我想寻求帮助 - 也许有人已经体验过 F#、TypeProviders 和 Docker。 问题是我无法仅在 docker 中使用类型提供程序(json 或 csv)将文件作为源(如果我 运行 它以老式的方式说出来按预期工作)。

代码特别短;

Program.fs

open FSharp.Data;

type Config = JsonProvider<"config.json">

[<EntryPoint>]
let main argv =
    let config = Config.GetSample()
    printfn "%s" config.Whataver
    0

config.json

{
  "Whataver": "Value to print"
}

Dokerfile(Visual studio自动生成一个)

FROM mcr.microsoft.com/dotnet/core/runtime:3.1-buster-slim AS base
WORKDIR /app
FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build
WORKDIR /src
COPY ["ConsoleFsharp/ConsoleFsharp.fsproj", "ConsoleFsharp/"]
RUN dotnet restore "ConsoleFsharp/ConsoleFsharp.fsproj"
COPY . .
WORKDIR "/src/ConsoleFsharp"
RUN dotnet build "ConsoleFsharp.fsproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "ConsoleFsharp.fsproj" -c Release -o /app/publish
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "ConsoleFsharp.dll"]

旧时尚方式结果:

运行宁在docker (linux):

我已经尝试将文件用作带有 TypePovider 嵌入式资源设置的嵌入式资源,但这不会改变行为。我什至可以嵌入它们,当我 运行 它没有 docker 时它仍然有效,它甚至在作为独立的应用程序单个文件发布时也有效...(当然没有 docker)但docker拒绝任何配置合作。提前感谢大家的帮助!

P.S 是的,我确定 cinfig.json 文件在 docker 容器中。

问题是您使用了 Config.GetSample(),它采用您在提供程序构造函数(在尖括号中)中指定的文件的路径。改用:

open FSharp.Data

type Config = JsonProvider<"config.json">

[<EntryPoint>]
let main argv = 
    // ensure you have set the "Copy" property of config.json to "Copy Always"
    // specify here relative path to config.json, for example:
    let path = "./config.json"
    let config = Config.Load(path)
    printfn "%s" config.Whatever
    // prints "Value to print"
    0

再次确保您已将 config.json 的“复制”属性 设置为“始终复制” ".