Ошибка запуска контейнера Docker от VS2019 - PullRequest
1 голос
/ 30 октября 2019

Я создал консольное приложение .Net Core 3.0, которое генерирует отчеты в формате PDF с помощью Telerik. Telerik использует библиотеку GDI + для этого. Приложение использует внутренне разработанную dll, которая зависит от журналов событий Windows, поэтому, к сожалению, о хостинге в Linux в настоящее время не может быть и речи.

Я пытаюсь запустить это приложение в док-контейнере, но изо всех сил пытаюсь его получить. работать через Visual Studio 2019 при использовании полного ядра сервера Windows образа. Насколько я понимаю, это единственный образ, в котором есть библиотеки GDI +, которые мне нужны.

При использовании servercore: 1803 я получаю эту ошибку при запуске через Visual Studio: "Невозможно запустить программу 'C: \ Program Files \ dotnet \ dotnet.exe'. Системе не удается найти указанный путь."

Error message received from Visual Studio 2019 Судя по выводам журналов из Container Tools и Build, кажется, что все работает как положено.

Вот мой полный файл docker. Это именно то, что Visual Studio добавляет, когда вы выбираете «Добавить -> Поддержка Docker ...» за исключением используемых изображений. Обратите внимание, когда я использую 3.0-nanoserver-1803 Visual Studio запускает контейнер должным образом, но завершается неудачно, когда выполняется код создания отчета, требующий GDI.

FROM mcr.microsoft.com/windows/servercore:1803 AS base
#FROM mcr.microsoft.com/dotnet/core/runtime:3.0-nanoserver-1803 AS base
WORKDIR /app   

FROM mcr.microsoft.com/windows/servercore:1803 AS build
#FROM mcr.microsoft.com/dotnet/core/sdk:3.0-nanoserver-1803 AS build
WORKDIR /src
COPY ["DM.Web.Reporting.Background/DM.Web.Reporting.Background.csproj", "DM.Web.Reporting.Background/"]
RUN dotnet restore "DM.Web.Reporting.Background/DM.Web.Reporting.Background.csproj"
COPY . .
WORKDIR "/src/DM.Web.Reporting.Background"
RUN dotnet build "DM.Web.Reporting.Background.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "DM.Web.Reporting.Background.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "DM.Web.Reporting.Background.dll"]

Я что-то здесь не так делаю? Я новичок в Docker, так что, надеюсь, я пропустил что-то простое.

1 Ответ

2 голосов
/ 31 октября 2019

Это может быть связано с тем, что вы изменили образы среды выполнения .NET Core и базового SDK на образ Windows Server Core:

FROM mcr.microsoft.com/windows/servercore:1803 AS build
#FROM mcr.microsoft.com/dotnet/core/sdk:3.0-nanoserver-1803 AS build

В образе Server Core не установлено .NET Core. в этом. Вам нужно будет установить его как часть вашего Dockerfile.

Я изменил ваш Dockerfile для установки среды выполнения .NET Core на этапе выполнения и SDK на этапе SDK:

FROM mcr.microsoft.com/windows/servercore:1803 AS base
#FROM mcr.microsoft.com/dotnet/core/runtime:3.0-nanoserver-1803 AS base

# Install .NET Core Runtime
RUN powershell -Command \
        $ProgressPreference = 'SilentlyContinue'; \
        Invoke-WebRequest \
            -UseBasicParsing \
            -Uri https://dot.net/v1/dotnet-install.ps1 \
            -OutFile dotnet-install.ps1; \
        ./dotnet-install.ps1 \
            -InstallDir '/Program Files/dotnet' \
            -Channel 3.0 \
            -Runtime dotnet; \
        Remove-Item -Force dotnet-install.ps1 \
    && setx /M PATH "%PATH%;C:\Program Files\dotnet"

WORKDIR /app   

FROM mcr.microsoft.com/windows/servercore:1803 AS build
#FROM mcr.microsoft.com/dotnet/core/sdk:3.0-nanoserver-1803 AS build

# Install .NET Core SDK
RUN powershell -Command \
        $ProgressPreference = 'SilentlyContinue'; \
        Invoke-WebRequest \
            -UseBasicParsing \
            -Uri https://dot.net/v1/dotnet-install.ps1 \
            -OutFile dotnet-install.ps1; \
        ./dotnet-install.ps1 \
            -InstallDir '/Program Files/dotnet' \
            -Channel 3.0 \
        Remove-Item -Force dotnet-install.ps1 \
    && setx /M PATH "%PATH%;C:\Program Files\dotnet"

WORKDIR /src
COPY ["DM.Web.Reporting.Background/DM.Web.Reporting.Background.csproj", "DM.Web.Reporting.Background/"]
RUN dotnet restore "DM.Web.Reporting.Background/DM.Web.Reporting.Background.csproj"
COPY . .
WORKDIR "/src/DM.Web.Reporting.Background"
RUN dotnet build "DM.Web.Reporting.Background.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "DM.Web.Reporting.Background.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "DM.Web.Reporting.Background.dll"]

См. https://docs.microsoft.com/en-us/dotnet/core/tools/dotnet-install-script для более подробной информации о том, как использовать скрипт установки dotnet.

ОБНОВЛЕНИЕ:

Для получения более общих инструкций о том, как.NET Core можно установить в Dockerfile (Linux или Windows), см. https://github.com/dotnet/dotnet-docker/blob/master/samples/snippets/installing-dotnet.md.

...