Невозможно использовать поставщиков типов, использующих файл в качестве источника только в docker - PullRequest
1 голос
/ 13 января 2020

У меня заканчиваются идеи, поэтому я хотел попросить о помощи - возможно, у кого-то уже было приключение с F #, TypeProviders и Docker. Проблема в том, что я не могу использовать провайдера типов (json или csv) с файлом в качестве источника только в docker (если я запусту его, скажем так, по старинке, он будет работать как положено).

Код очень короткий;

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"]

Результат по старинке:

enter image description here

работает в docker (linux):

enter image description here

Я уже пытался использовать файл в качестве встроенного ресурса с настройкой TypePovider Embedded Resource, но это не меняет поведение. Я даже могу встроить их, и это все еще работает, когда я запускаю его без docker, Это даже работает, когда публикуется как отдельный файл приложения ... (без docker конечно) Но docker отказывается сотрудничать в любая конфигурация. Ребята, заранее спасибо за любую помощь!

PS Да, я уверен, что файл cinfig. json находится в контейнере docker.

1 Ответ

1 голос
/ 13 января 2020

Проблема заключается в том, что вы использовали 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

Опять же, убедитесь, что вы установили свойство " Copy " конфигурации. json в " Copy Always ".

...