找不到与 Docker "dotnet-/app/BuildClearPluginAssemblies.dll"匹配命令的可执行文件



我正在尝试使用docker映像运行我的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/BuildClearPluginAssemblies.dll"
/app/Build/ClearPluginAssemblies.proj(21,5): error MSB3073: The command "dotnet "/app/BuildClearPluginAssemblies.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

编辑:2Web项目文件:

<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="....LibrariesMyProject.CoreMyProject.Core.csproj" />
<ProjectReference Include="....LibrariesMyProject.DataMyProject.Data.csproj" />
<ProjectReference Include="....LibrariesMyProject.ServicesMyProject.Services.csproj" />
<ProjectReference Include="..MyProject.Web.FrameworkMyProject.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_DataDataProtectionKeys*.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="AreasAdminsitemap.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)Pluginsbin*.*" Exclude="$(MSBuildProjectDirectory)Pluginsbinplaceholder.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)....BuildClearPluginAssemblies.proj" Properties="PluginPath=$(PluginsFolders)" Targets="NopClear" />
</Target>
<PropertyGroup>  
<ConcurrentGarbageCollection>false</ConcurrentGarbageCollection>
</PropertyGroup>
</Project> 

这看起来更像是一个dotnet发布问题,而不是docker的实际问题。

如果搜索dotnet cli显示的MSB3073的实际错误,可以发现它通常与生成后事件有关。在许多情况下,生成后事件中引用的每个文件夹/程序集的路径都不正确。

如果我们仔细观察发布命令执行时的位置

WORKDIR /app/Presentation/MyProject.Web

例如,查看错误消息中的PluginPath

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

然后,您可以看到该路径不是从执行命令的位置内联的。

一种解决方案是添加绝对路径,或者使它们与执行发布命令的位置相对。您还可以为每个配置指定特定的后/前事件,以下是关于发布事件的答案

最新更新