【发布时间】:2019-05-03 19:32:12
【问题描述】:
我正在尝试使用 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/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>
【问题讨论】:
-
你的项目文件夹结构是什么?你跑了哪条路
docker build?你在docker build命令中错过了.吗?与我们分享一个演示项目以重现您的问题。 -
@TaoZhou:对不起,我错过了问题中已更新的
.。此外,添加了项目结构。进一步注意,我已将此解决方案提供给另一个解决方案,他能够构建映像并运行容器,但是同样我面临一个问题,这很奇怪 -
你能把MyProject.Web的项目文件贴出来吗?而且,.. 您将包括所有工件的解决方案复制到您的 docker 映像中。 (并且 MyProject.Web 被复制了两次)。您可以先尝试清理解决方案,以确保现有工件没有问题。如果这没有帮助,我会删除从您的发布行开始的所有内容并构建并运行您的图像。然后进入您正在运行的容器,检查复制的内容并手动运行发布命令 - 或测试一些其他命令。
-
@ChristophLütjen:在问题中添加了 MyProject.Web
-
@deeptowncitizen,是的,我在 windows 系统上使用 Linux 容器,我切换到 windows 容器并开始工作
标签: c# docker asp.net-core asp.net-core-2.0 docker-build