Сборка Dockerfile в ASP. NET Не удается выполнить основной проект при запуске do tnet publi sh - c Release -o out - PullRequest
3 голосов
/ 18 марта 2020

При запуске 'docker build. -t project 'Я получаю эту ошибку:

Step 6/10 : RUN dotnet publish -c Release -o out
 ---> Running in 73c3f5fa9112
Microsoft (R) Build Engine version 16.5.0+d4cbfca49 for .NET Core
Copyright (C) Microsoft Corporation. All rights reserved.

  Restore completed in 55.93 ms for /app/Backend.csproj.
/usr/share/dotnet/sdk/3.1.200/Sdks/Microsoft.NET.Sdk/targets/Microsoft.PackageDependencyResolution.targets(234,5): error NETSDK1064: Pa
ckage Microsoft.CodeAnalysis.Analyzers, version 2.9.8 was not found. It might have been deleted since NuGet restore. Otherwise, NuGet r
estore might have only partially completed, which might have been due to maximum path length restrictions. [/app/Backend.csproj]
The command '/bin/sh -c dotnet publish -c Release -o out' returned a non-zero code: 1

Мой Dockerfile выглядит следующим образом:

FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build-env
WORKDIR /app

# Copy csproj and restore as distinct layers
COPY *.csproj ./
RUN dotnet restore

# Copy everything else and build
COPY . ./
RUN dotnet publish -c Release -o out

# Build runtime image
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1
WORKDIR /app
COPY --from=build-env /app/out .

# Command used to start the project
ENTRYPOINT ["dotnet", "Project.dll"]

Я установил пакет, указанный в сообщении об ошибке от NuGet. Когда я запускаю команду 'do tnet publi sh - c Release -o out' в терминале, она работает, но запускать ее внутри Dockerfile не удается. Есть идеи?

Мои ссылки на пакеты:

<PackageReference Include="Microsoft.AspNetCore.Authentication.Facebook" Version="3.1.2" />
    <PackageReference Include="Microsoft.AspNetCore.Authentication.Google" Version="3.1.2" />
    <PackageReference Include="Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore" Version="3.1.2" />
    <PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="3.1.2" />
    <PackageReference Include="Microsoft.AspNetCore.Identity.UI" Version="3.1.2" />
    <PackageReference Include="Microsoft.CodeAnalysis.Analyzers" Version="2.9.8" />
    <PackageReference Include="Microsoft.CodeAnalysis.FxCopAnalyzers" Version="2.9.8" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="3.1.2" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="3.1.2" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="3.1.2" />
    <PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="3.1.1" />

Вывод из RUN do tnet восстановление:

Step 4/10 : RUN dotnet restore
 ---> Running in 1f26d6ac4244
  Restore completed in 47.46 sec for /app/Backend.csproj.
Removing intermediate container 1f26d6ac4244
 ---> f1a2994a2704

1 Ответ

2 голосов
/ 20 марта 2020

Я только что столкнулся с той же ошибкой, которая была только проблемной c на моей локальной машине (все работало хорошо на CI).

Так что я задался вопросом, что отличало мою машину и CI. Ответ: Ранее я запускал локальную версию моего проекта do tnet.

Проблема для меня заключалась в том, что том для монтирования (а также команда COPY ./ .) были включая пакеты nuget с моего хост-компьютера во встроенный контейнер. Затем, очевидно, dotnet restore не установил пакеты снова, так как считал, что они уже есть, даже если они не были для соответствующей платформы (я работал здесь WSL 2 docker на хосте Windows 10).

Чтобы исправить это, мне нужно было сделать следующее:

  1. В моем файле docker compome добавьте том, чтобы взять то, что уже находится внутри встроенного контейнера, при монтировании мои локальные файлы для разработки. Вот как это выглядит:
volumes:
    - ./server:/app
    - /app/obj/
    - /app/bin/
    - /app/out/
Затем внутри папки проекта do tnet я создал файл .dockerignore, чтобы исключить пакет и связанные файлы сборки из COPIED на этапе сборки docker (также это что делается согласно dotnet-docker-samples). Вот содержимое файла:
bin/
obj/
out/

Надеюсь, что это может помочь другим! ?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...