c# - 找不到与命令 "dotnet-/app/Build\ClearPluginAssemblies.dll"Docker 匹配的可执行文件

标签 c# docker asp.net-core asp.net-core-2.0 docker-build

我正在尝试使用 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 . 它给了我一个错误:

命令“/bin/sh -c dotnet publish -c Release -o out”返回一个非零代码: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 Web 项目文件:

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

最佳答案

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

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

如果我们仔细看看我们在执行发布命令时所处的位置

WORKDIR /app/Presentation/MyProject.Web

然后例如查看错误消息中的PluginPath

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

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

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

关于c# - 找不到与命令 "dotnet-/app/Build\ClearPluginAssemblies.dll"Docker 匹配的可执行文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53577946/

相关文章:

c# - .Net Framework 中的字符串实习 - 有什么好处以及何时使用实习

c# - 使用.NET将多个ogg vorbis文件顺序连接到一个文件中?

c# - 从 ASP.NET Core 中的 ExceptionFilterAttribute 访问 Controller

c# - Moq 一个类并仍然使用它的方法

linux - 无法使用 SYSTEMCTL 在 ubuntu 16 服务器上实现 aspnet 核心

c# - 如何让 xmlserializer 只序列化纯 xml?

c# - X509 证书未在服务器上加载私钥文件

azure - 如何在Azure的Ubuntu虚拟机中将http端口重定向到Docker

windows - Windows 上的 Docker 配置文件位置,例如,启用不安全的注册表/docker 选项

linux - Docker 文件 ENTRYPOINT 无法检测到我的启动脚本