39

我正在学习https://docs.microsoft.com/en-us/dotnet/core/docker/docker-basics-dotnet-core#dockerize-the-net-core-application上的教程学习容器化 .net核心应用程序到 Docker 中。

除了将Dockerfile指向点更改microsoft/dotnet:2.1-sdk为基础图像,并添加RUN dotnet --info一行来获取版本/环境信息之外,其他一切都是一样的。但是,我在该dotnet publish步骤中遇到错误:

Step 7/8 : RUN dotnet publish -c Release -o out
 ---> Running in 6739267c7581
Microsoft (R) Build Engine version 15.8.166+gd4e8d81a88 for .NET Core
Copyright (C) Microsoft Corporation. All rights reserved.

  Restore completed in 34.46 ms for /app/Hello.csproj.
/usr/share/dotnet/sdk/2.1.401/Sdks/Microsoft.NET.Sdk/targets/Microsoft.PackageDependencyResolution.targets(198,5): error MSB4018: The "ResolvePackageAssets" task failed unexpectedly. [/app/Hello.csproj]
/usr/share/dotnet/sdk/2.1.401/Sdks/Microsoft.NET.Sdk/targets/Microsoft.PackageDependencyResolution.targets(198,5): error MSB4018: NuGet.Packaging.Core.PackagingException: Unable to find fallback package folder 'C:\Program Files\dotnet\sdk\NuGetFallbackFolder'. [/app/Hello.csproj]
/usr/share/dotnet/sdk/2.1.401/Sdks/Microsoft.NET.Sdk/targets/Microsoft.PackageDependencyResolution.targets(198,5): error MSB4018:    at NuGet.Packaging.FallbackPackagePathResolver..ctor(String userPackageFolder, IEnumerable`1 fallbackPackageFolders) [/app/Hello.csproj]
/usr/share/dotnet/sdk/2.1.401/Sdks/Microsoft.NET.Sdk/targets/Microsoft.PackageDependencyResolution.targets(198,5): error MSB4018:    at Microsoft.NET.Build.Tasks.NuGetPackageResolver.CreateResolver(LockFile lockFile, String projectPath) [/app/Hello.csproj]
/usr/share/dotnet/sdk/2.1.401/Sdks/Microsoft.NET.Sdk/targets/Microsoft.PackageDependencyResolution.targets(198,5): error MSB4018:    at Microsoft.NET.Build.Tasks.ResolvePackageAssets.CacheWriter..ctor(ResolvePackageAssets task, Stream stream) [/app/Hello.csproj]
/usr/share/dotnet/sdk/2.1.401/Sdks/Microsoft.NET.Sdk/targets/Microsoft.PackageDependencyResolution.targets(198,5): error MSB4018:    at Microsoft.NET.Build.Tasks.ResolvePackageAssets.CacheReader.CreateReaderFromDisk(ResolvePackageAssets task, Byte[] settingsHash) [/app/Hello.csproj]
/usr/share/dotnet/sdk/2.1.401/Sdks/Microsoft.NET.Sdk/targets/Microsoft.PackageDependencyResolution.targets(198,5): error MSB4018:    at Microsoft.NET.Build.Tasks.ResolvePackageAssets.CacheReader..ctor(ResolvePackageAssets task) [/app/Hello.csproj]
/usr/share/dotnet/sdk/2.1.401/Sdks/Microsoft.NET.Sdk/targets/Microsoft.PackageDependencyResolution.targets(198,5): error MSB4018:    at Microsoft.NET.Build.Tasks.ResolvePackageAssets.ReadItemGroups() [/app/Hello.csproj]
/usr/share/dotnet/sdk/2.1.401/Sdks/Microsoft.NET.Sdk/targets/Microsoft.PackageDependencyResolution.targets(198,5): error MSB4018:    at Microsoft.NET.Build.Tasks.ResolvePackageAssets.ExecuteCore() [/app/Hello.csproj]
/usr/share/dotnet/sdk/2.1.401/Sdks/Microsoft.NET.Sdk/targets/Microsoft.PackageDependencyResolution.targets(198,5): error MSB4018:    at Microsoft.NET.Build.Tasks.TaskBase.Execute() [/app/Hello.csproj]
/usr/share/dotnet/sdk/2.1.401/Sdks/Microsoft.NET.Sdk/targets/Microsoft.PackageDependencyResolution.targets(198,5): error MSB4018:    at Microsoft.Build.BackEnd.TaskExecutionHost.Microsoft.Build.BackEnd.ITaskExecutionHost.Execute() [/app/Hello.csproj]
/usr/share/dotnet/sdk/2.1.401/Sdks/Microsoft.NET.Sdk/targets/Microsoft.PackageDependencyResolution.targets(198,5): error MSB4018:    at Microsoft.Build.BackEnd.TaskBuilder.ExecuteInstantiatedTask(ITaskExecutionHost taskExecutionHost, TaskLoggingContext taskLoggingContext, TaskHost taskHost, ItemBucket bucket, TaskExecutionMode howToExecuteTask) [/app/Hello.csproj]
The command '/bin/sh -c dotnet publish -c Release -o out' returned a non-zero code: 1

到目前为止,我在这个主题上唯一能找到的是一些 github 问题,要求在 Docker 中丢弃备用文件夹,因为它会使容器膨胀。在这个阶段我并不太担心臃肿,我只是希望它构建一个 hello world 应用程序。


如果有帮助,dotnet --info命令返回以下内容:

Step 3/8 : RUN dotnet --info
 ---> Running in 17dad2f04a7e
.NET Core SDK (reflecting any global.json):
 Version:   2.1.401
 Commit:    91b1c13032

Runtime Environment:
 OS Name:     debian
 OS Version:  9
 OS Platform: Linux
 RID:         debian.9-x64
 Base Path:   /usr/share/dotnet/sdk/2.1.401/

Host (useful for support):
  Version: 2.1.3
  Commit:  124038c13e

.NET Core SDKs installed:
  2.1.401 [/usr/share/dotnet/sdk]

.NET Core runtimes installed:
  Microsoft.AspNetCore.All 2.1.3 [/usr/share/dotnet/shared/Microsoft.AspNetCore.All]
  Microsoft.AspNetCore.App 2.1.3 [/usr/share/dotnet/shared/Microsoft.AspNetCore.App]
  Microsoft.NETCore.App 2.1.3 [/usr/share/dotnet/shared/Microsoft.NETCore.App]

To install additional .NET Core runtimes or SDKs:
  https://aka.ms/dotnet-download
4

5 回答 5

44

这可能是由于obj\project.assests.json打开项目时 Visual Studio 生成的文件所致。如果您在那里查看,您会发现对 Windows 系统中 NuGet 包文件夹的引用。

例如

"packageFolders": {
  "C:\\Users\\<UserName>\\.nuget\\packages\\": {},
  "C:\\Program Files\\dotnet\\sdk\\NuGetFallbackFolder": {}
},

一个简单的解决方法是在 Dockerfile 中添加一个步骤,以在运行任何还原、构建或测试步骤之前删除bin和文件。obj一种方法是使用该find程序:

find -type d -name bin -prune -exec rm -rf {} \; && find -type d -name obj -prune -exec rm -rf {} \;

使用链接到的教程中的 Dockerfile 作为示例,它看起来像这样:

FROM microsoft/dotnet:2.1-sdk
WORKDIR /app

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

# copy and build everything else
COPY . ./
RUN find -type d -name bin -prune -exec rm -rf {} \; && find -type d -name obj -prune -exec rm -rf {} \;
RUN dotnet publish -c Release -o out
ENTRYPOINT ["dotnet", "out/Hello.dll"]
于 2018-09-06T01:57:20.680 回答
44

问题是你的 bin 和 obj 目录中有一些挥之不去的文件,你不需要从源代码构建你的应用程序。因此,我认为最好的解决方案是将 bin 和 obj 目录添加到 .dockerignore 文件中,这将排除这些文件夹复制到您的 Docker 上下文中,从而稍微提高性能。这是我的 .dockerignore 文件在 dotnet 应用程序中的样子:

.dockerignore
.env
.git
.gitignore
.vs
.vscode
docker-compose.yml
docker-compose.*.yml
**/bin
**/obj
bin/
obj/
于 2019-06-28T18:47:50.093 回答
3

您可以添加一个.dockerignore文件,以便obj在使用 docker 构建映像时忽略本地创建的任何目录,例如将其放入.dockerignore. 这对我有用。

*/obj/*
于 2021-01-29T00:11:25.300 回答
3

如果您的 docker 容器属于 linux 系列,请将此标志添加-r linux-x64到发布命令,此标志应涵盖“(大多数桌面发行版,如 CentOS、Debian、Fedora、Ubuntu 和衍生产品)”的构建;因此RUN dotnet publish -r linux-x64 -c Release -o out 对于其他 RID,发布命令应如下所示,请参阅此https://docs.microsoft.com/en-us/dotnet/core/rid-catalog

于 2020-03-22T11:16:12.787 回答
0

就我而言,在检查了所有这些响应后问题仍然存在,唯一的解决方案是重新启动 docker 桌面。

于 2020-03-27T15:22:27.023 回答