Не найден исполняемый файл, соответствующий команде "dotnet- / app / Build \ ClearPluginAssemblies.dll" Docker - PullRequest
0 голосов
/ 02 декабря 2018

Я пытаюсь запустить приложение ASP.NET Core 2.1 с образом докера.Для этого у меня есть файл Docker со следующим содержимым:

FROM microsoft/dotnet:2.1-sdk AS build
WORKDIR /app

# copy csproj and restore as distinct layers
COPY . .
RUN dotnet restore

# copy everything else and build app
COPY Presentation/MyProject.Web/. ./Presentation/MyProject.Web/
WORKDIR /app/Presentation/MyProject.Web
RUN dotnet publish -c Release -o out

# Build runtime image
FROM microsoft/dotnet:aspnetcore-runtime
WORKDIR /app
COPY --from=build /app/Presentation/MyProject.Web/out .
ENTRYPOINT ["dotnet", "MyProject.Web.dll"] 

Но при выполнении команды docker build -t MyProject-web . выдает ошибку:

The command '/bin/sh -c dotnet publish -c Release -o out' returned a non-zero code: 1


 MyProject.Web -> /app/Presentation/MyProject.Web/bin/Release/netcoreapp2.1/MyProject.Web.dll
  No executable found matching command "dotnet-/app/Build\ClearPluginAssemblies.dll"
/app/Build/ClearPluginAssemblies.proj(21,5): error MSB3073: The command "dotnet "/app/Build\ClearPluginAssemblies.dll" "OutputPath=/app/Build/../Presentation/MyProject.Web/bin/Release/netcoreapp2.1/|PluginPath=/app/Presentation/MyProject.Web/Plugins/DiscountRules.CustomerRoles/;/app/Presentation/MyProject.Web/Plugins/ExchangeRate.EcbExchange/;/app/Presentation/MyProject.Web/Plugins/ExternalAuth.Facebook/;/app/Presentation/MyProject.Web/Plugins/Payments.CheckMoneyOrder/;/app/Presentation/MyProject.Web/Plugins/Payments.Manual/;/app/Presentation/MyProject.Web/Plugins/Payments.PayPalStandard/;/app/Presentation/MyProject.Web/Plugins/Payments.Square/;/app/Presentation/MyProject.Web/Plugins/Payments.Worldpay/;/app/Presentation/MyProject.Web/Plugins/Pickup.PickupInStore/;/app/Presentation/MyProject.Web/Plugins/Shipping.FixedByWeightByTotal/;/app/Presentation/MyProject.Web/Plugins/Shipping.UPS/;/app/Presentation/MyProject.Web/Plugins/Tax.FixedOrByCountryStateZip/;/app/Presentation/MyProject.Web/Plugins/Widgets.GoogleAnalytics/;/app/Presentation/MyProject.Web/Plugins/Widgets.NivoSlider/|SaveLocalesFolders="" exited with code 1.
The command '/bin/sh -c dotnet publish -c Release -o out' returned a non-zero code: 1

Редактировать 1: Вот моя структура проекта:

Build
    ClearPluginAssemblies
Libraries
    MyProject.Core
    MyProject.Data
    MyProject.Services
Plugins
    MyProject.Plugin.Discount
    MyProject.Plugin.Payment
    ..
Presentation
    MyProject.Web   
    MyProject.Web.Framework
Tests

Редактировать: 2 Файл веб-проекта:

<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>netcoreapp2.1</TargetFramework>        
    <Description>MyProject.Web is also an MVC web application project, a presentation layer for public store and admin area.</Description>                
  </PropertyGroup>

  <ItemGroup>
    <ProjectReference Include="..\..\Libraries\MyProject.Core\MyProject.Core.csproj" />
    <ProjectReference Include="..\..\Libraries\MyProject.Data\MyProject.Data.csproj" />
    <ProjectReference Include="..\..\Libraries\MyProject.Services\MyProject.Services.csproj" />
    <ProjectReference Include="..\MyProject.Web.Framework\MyProject.Web.Framework.csproj" />
  </ItemGroup>

  <ItemGroup>
    <!-- We copy the entire \App_Data directory. But we ignore JSON files and data protection keys  -->
    <Content Include="App_Data\**" CopyToPublishDirectory="PreserveNewest" Exclude="App_Data\*.json" />
    <Content Update="App_Data\*.json" CopyToPublishDirectory="Never" />
    <Content Update="App_Data\DataProtectionKeys\*.xml" CopyToPublishDirectory="Never" />

    <Compile Remove="Plugins\**" />
    <EmbeddedResource Remove="Plugins\**" />
    <None Remove="Plugins\**" />

    <Content Include="Plugins\**" CopyToPublishDirectory="PreserveNewest" Exclude="Plugins\**\*.config;Plugins\**\*.cshtml;Plugins\**\*.json" />
    <Content Include="Themes\**" CopyToPublishDirectory="PreserveNewest" Exclude="Themes\**\*.config;Themes\**\*.cshtml;Themes\**\*.json" />

    <!-- We copy the \Logs directory -->
    <Content Include="Logs\**" CopyToPublishDirectory="PreserveNewest" />

    <None Update="Areas\Admin\sitemap.config">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </None>
  </ItemGroup>

  <ItemGroup>
    <Folder Include="Plugins\" />
  </ItemGroup>

  <!-- This target execute after "Build" target.
    We use it to clean up folder with plugins from unnecessary and obsolete libraries. -->
  <Target Name="NopTarget" AfterTargets="Build">
    <ItemGroup>
      <!-- Get plugin description files to get plugin paths -->
      <PluginsDescription Include="$(MSBuildProjectDirectory)\Plugins\**\plugin.json;" />      
      <!-- Get paths for all plugins -->
      <PluginsFolders Include="@(PluginsDescription->'%(relativedir)')" />

      <!-- Get all the libraries from the shadow copy folder to remove them,
        because depending on the settings, this may not happen when the application is starting,
        but this can lead to unpredictable results during debugging of the project. -->
      <ShadowCopiesLibraries Include="$(MSBuildProjectDirectory)\Plugins\bin\*.*" Exclude="$(MSBuildProjectDirectory)\Plugins\bin\placeholder.txt" />
    </ItemGroup>
    <PropertyGroup>
      <PluginsFolders>@(PluginsFolders)</PluginsFolders>
    </PropertyGroup>
    <!-- Delete libraries from the shadow copy folder -->
    <Delete Files="@(ShadowCopiesLibraries)" />
    <!-- When .NET Core builds a project, it copies all referenced libraries to the output folder.
      For plugins it creates too many unnecessary files that just take up space.
      At the moment you can't disable this behavior. That's why we have to manually delete all unnecessary libraries from plugin output directories. -->
    <MSBuild Projects="$(MSBuildProjectDirectory)\..\..\Build\ClearPluginAssemblies.proj" Properties="PluginPath=$(PluginsFolders)" Targets="NopClear" />
  </Target>

  <PropertyGroup>  
    <ConcurrentGarbageCollection>false</ConcurrentGarbageCollection>
  </PropertyGroup>

</Project> 

1 Ответ

0 голосов
/ 04 декабря 2018

Это больше похоже на проблему публикации в dotnet, чем на самом деле проблему с докером.

Если вы ищете по фактической ошибке, которую показывает dotnet cli MSB3073 , вы можете обнаружить, что она часто связанаразмещать события сборки.Во многих случаях путь к каждой папке / сборке, указанной в событии после сборки, неверен.

Если мы посмотрим ближе, где мы находимся, когда выполняется команда публикации

WORKDIR /app/Presentation/MyProject.Web

А затем, например, посмотрите на PluginPath в сообщении об ошибке

..PluginPath=/app/Presentation/MyProject.Web/Plugins/DiscountRules.CustomerRoles/;..

. После этого вы увидите, что путь не является внутренним от того места, где выполняется команда.

Одним из решений было бы добавить абсолютный путь или сделать его относительно того места, где выполняется команда публикации.Вы также можете указать конкретную запись / предварительные события для каждой конфигурации, вот ответ относительно publish-events

...