仅在 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 的“复制”属性 设置为“始终复制” ".
我 运行 没有想法,所以我想寻求帮助 - 也许有人已经体验过 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 的“复制”属性 设置为“始终复制” ".