Docker容器中dotnet恢复失败

12
我已经研究了这个问题数天,但是我找到的所有研究都没有帮助我解决这个问题,包括重新启动 Docker、重新启动 Docker 服务、重新启动 Visual Studio、删除 Nuget、调整代理设置、调整 Nuget.config 等等。
最终我得到的错误消息是“无法加载源 https://api.nuget.org/v3/index.json 的服务索引。”但请耐心等待,我将给出重现此错误的确切步骤。
当我在 Visual Studio 2019 中创建一个 ASP.NET Core Web 应用程序,然后向项目添加 Docker 支持(右键单击项目,选择添加 -> Docker 支持...),会创建一个 Dockerfile,如下所示:
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-nanoserver-1809 AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

FROM mcr.microsoft.com/dotnet/core/sdk:3.1-nanoserver-1809 AS build
WORKDIR /src
COPY ["WebApplication3/WebApplication3.csproj", "WebApplication3/"]
RUN dotnet restore "WebApplication3/WebApplication3.csproj"
COPY . .
WORKDIR "/src/WebApplication3"
RUN dotnet build "WebApplication3.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "WebApplication3.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "WebApplication3.dll"]

当我构建Docker镜像(右键点击Dockerfile,选择构建Docker镜像)时,它能够正常构建并且会提示:
Starting up container(s)...
docker build -f "C:\Users\TheUser\source\repos\WebApplication3\WebApplication3\Dockerfile" --force-rm -t webapplication3:dev --target base  --label "com.microsoft.created-by=visual-studio" --label "com.microsoft.visual-studio.project-name=WebApplication3" "C:\Users\TheUser\source\repos\WebApplication3" 
Sending build context to Docker daemon  4.396MB

Step 1/6 : FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-nanoserver-1809 AS base
 ---> dc28376d4369
Step 2/6 : WORKDIR /app
 ---> Using cache
 ---> d0cbefb504d1
Step 3/6 : EXPOSE 80
 ---> Using cache
 ---> 865f960359d6
Step 4/6 : EXPOSE 443
 ---> Using cache
 ---> 4d040d5c8a4c
Step 5/6 : LABEL com.microsoft.created-by=visual-studio
 ---> Using cache
 ---> 4223be37abec
Step 6/6 : LABEL com.microsoft.visual-studio.project-name=WebApplication3
 ---> Running in d1ced38ba0fa
Removing intermediate container d1ced38ba0fa
 ---> fb400230edf4
Successfully built fb400230edf4
Successfully tagged webapplication3:dev
docker run -dt -v "C:\Users\TheUser\onecoremsvsmon\16.4.0067.0:C:\remote_debugger:ro" -v "C:\Users\TheUser\source\repos\WebApplication3\WebApplication3:C:\app" -v "C:\Users\TheUser\source\repos\WebApplication3:C:\src" -v "C:\Users\TheUser\AppData\Roaming\Microsoft\UserSecrets:C:\Users\ContainerUser\AppData\Roaming\Microsoft\UserSecrets:ro" -v "C:\Users\TheUser\AppData\Roaming\ASP.NET\Https:C:\Users\ContainerUser\AppData\Roaming\ASP.NET\Https:ro" -v "C:\Users\TheUser\.nuget\packages\:c:\.nuget\fallbackpackages2" -v "C:\Program Files\dotnet\sdk\NuGetFallbackFolder:c:\.nuget\fallbackpackages" -e "DOTNET_USE_POLLING_FILE_WATCHER=1" -e "ASPNETCORE_ENVIRONMENT=Development" -e "ASPNETCORE_URLS=https://+:443;http://+:80" -e "NUGET_PACKAGES=c:\.nuget\fallbackpackages2" -e "NUGET_FALLBACK_PACKAGES=c:\.nuget\fallbackpackages;c:\.nuget\fallbackpackages2" -P --name WebApplication3 --entrypoint C:\remote_debugger\x64\msvsmon.exe webapplication3:dev /noauth /anyuser /silent /nostatus /noclrwarn /nosecuritywarn /nofirewallwarn /nowowwarn /fallbackloadremotemanagedpdbs /timeout:2147483646 /LogDebuggeeOutputToStdOut 
eba5dec02ed7a80158340d6f8d6af504b86edf7cd6944eb1d4ce71f7847fabb5
Container started successfully.
========== Finished ==========

然而,如果我将.NET Core类库添加到解决方案中,并将该类库作为项目引用添加到Web应用程序中,再次添加Docker支持,我会得到一个新的Dockerfile,看起来像这样:
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-nanoserver-1809 AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

FROM mcr.microsoft.com/dotnet/core/sdk:3.1-nanoserver-1809 AS build
WORKDIR /src
COPY ["WebApplication3/WebApplication3.csproj", "WebApplication3/"]
COPY ["ClassLibrary1/ClassLibrary1.csproj", "ClassLibrary1/"]
RUN dotnet restore "WebApplication3/WebApplication3.csproj"
COPY . .
WORKDIR "/src/WebApplication3"
RUN dotnet build "WebApplication3.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "WebApplication3.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "WebApplication3.dll"]

当我再次构建Docker镜像时,我遇到了一个错误,看起来像这样:
1>------ Rebuild All started: Project: ClassLibrary1, Configuration: Debug Any CPU ------
1>ClassLibrary1 -> C:\Users\TheUser\source\repos\WebApplication3\ClassLibrary1\bin\Debug\netcoreapp3.1\ClassLibrary1.dll
2>------ Rebuild All started: Project: WebApplication3, Configuration: Debug Any CPU ------
2>docker rm -f eba5dec02ed7a80158340d6f8d6af504b86edf7cd6944eb1d4ce71f7847fabb5
2>eba5dec02ed7a80158340d6f8d6af504b86edf7cd6944eb1d4ce71f7847fabb5
2>WebApplication3 -> C:\Users\TheUser\source\repos\WebApplication3\WebApplication3\bin\Debug\netcoreapp3.1\WebApplication3.dll
2>WebApplication3 -> C:\Users\TheUser\source\repos\WebApplication3\WebApplication3\bin\Debug\netcoreapp3.1\WebApplication3.Views.dll
2>Docker version 19.03.8, build afacb8b
2>docker build -f "c:\users\TheUser\source\repos\webapplication3\webapplication3\dockerfile" --force-rm -t webapplication3  --label "com.microsoft.created-by=visual-studio" --label "com.microsoft.visual-studio.project-name=WebApplication3" "c:\users\TheUser\source\repos\webapplication3"
2>Sending build context to Docker daemon    4.4MB
2>
2>Step 1/20 : FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-nanoserver-1809 AS base
2> ---> dc28376d4369
2>Step 2/20 : WORKDIR /app
2> ---> Using cache
2> ---> d0cbefb504d1
2>Step 3/20 : EXPOSE 80
2> ---> Using cache
2>Step 4/20 : EXPOSE 443
2> ---> 865f960359d6
2> ---> Using cache
2> ---> 4d040d5c8a4c
2>Step 5/20 : FROM mcr.microsoft.com/dotnet/core/sdk:3.1-nanoserver-1809 AS build
2> ---> c67fa4d2a089
2>Step 6/20 : WORKDIR /src
2> ---> Using cache
2> ---> 14763e98238e
2>Step 7/20 : COPY ["WebApplication3/WebApplication3.csproj", "WebApplication3/"]
2> ---> ad0ded95d169
2>Step 8/20 : COPY ["ClassLibrary1/ClassLibrary1.csproj", "ClassLibrary1/"]
2> ---> 22667eda405c
2>Step 9/20 : RUN dotnet restore "WebApplication3/WebApplication3.csproj"
2> ---> Running in a3e6a184b4e9
2>  Restore completed in 495.4 ms for C:\src\ClassLibrary1\ClassLibrary1.csproj.
2>C:\Program Files\dotnet\sdk\3.1.201\NuGet.targets(124,5): error : Unable to load the service index for source https://api.nuget.org/v3/index.json. [C:\src\WebApplication3\WebApplication3.csproj]
2>C:\Program Files\dotnet\sdk\3.1.201\NuGet.targets(124,5): error :   No such host is known. [C:\src\WebApplication3\WebApplication3.csproj]
2>Removing intermediate container a3e6a184b4e9
2>The command 'cmd /S /C dotnet restore "WebApplication3/WebApplication3.csproj"' returned a non-zero code: 1
2>c:\users\TheUser\source\repos\webapplication3\webapplication3\dockerfile : error CTC1014: Docker command failed with exit code 1.
2>c:\users\TheUser\source\repos\webapplication3\webapplication3\dockerfile : error CTC1014: The command 'cmd /S /C dotnet restore "WebApplication3/WebApplication3.csproj"' returned a non-zero code: 1
2>Done building project "WebApplication3.csproj" -- FAILED.
========== Rebuild All: 1 succeeded, 1 failed, 0 skipped ==========

在此输入图像描述 应该很容易复制。为什么没有类库引用时它能正常工作,但添加引用后会出错?我需要在Dockerfile中添加一些额外的内容吗?我已经困扰了很长时间,其他帖子都没有这样表达或给我任何适用的答案。


1
我不仅在代理后面,而且有一个自定义的根证书。我必须将根证书复制到容器中,并运行“RUN update-ca-certificates”。 - jmzagorski
3
我曾经在寻找同样的问题,但我的问题是在dotnet中进行nugets的并行计算,这导致了对nuget包的许多请求,并阻塞了其中一些,结果是我通过dotnet restore --disable-parallel解决了这个问题。 - Mahdi Khalili
6个回答

4

但在我添加类库引用之前,它可以很好地还原。 - TrevorBrooks
1
你尝试过在Github链接上的任何解决方案吗? - Rosco
这是真正的问题 - 确保 Proxy 环境变量设置和为 NuGet 服务器指定的任何用户凭据都是正确的。很可能之前 NuGet 之所以成功是因为它在本地具有所有所需的依赖项,因此不需要调用 API。 - ryanwebjackson

3

您是否在使用某些代理,比如企业代理或其他类型的代理?

我通过在我的Dockerfile中设置http_proxy解决了这个问题。

ARG HTTP_PROXY="http://username:password@proxy.example.com:8080"

以下是完整的Dockerfile示例:
FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build-env

WORKDIR /app

# Copy csproj and restore as distinct layers

COPY *.csproj ./

ARG HTTP_PROXY="http://username:password@proxy.example.com:8080"

USER administrator
RUN dotnet restore

# Copy everything else and build

COPY . ./

USER administrator
RUN dotnet publish -c Release -o out

# Build runtime image

FROM mcr.microsoft.com/dotnet/core/aspnet:3.1

WORKDIR /app

COPY --from=build-env /app/out .

ENTRYPOINT ["dotnet", "myapp.dll"]

2

无法重现。这是我的Docker文件。

FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS base
WORKDIR /app
EXPOSE 80

FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build
WORKDIR /src
COPY ["WebApplication1.csproj", ""]
COPY ["../ClassLibrary1/ClassLibrary1.csproj", "../ClassLibrary1/"]
RUN dotnet restore "./WebApplication1.csproj"
COPY . .
WORKDIR "/src/."
RUN dotnet build "WebApplication1.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "WebApplication1.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "WebApplication1.dll"]

不同的线路:

COPY ["../ClassLibrary1/ClassLibrary1.csproj", "../ClassLibrary1/"]
RUN dotnet restore "./WebApplication1.csproj"

我认为你的csprojsln文件存储在不同的文件夹中。当使用Visual Studio时,请确保选择选项:将解决方案和项目文件放置在同一个文件夹中

enter image description here

答案的第二次更新:

对于每个添加/引用的项目,请添加Docker支持。

这将更新docker文件。

enter image description here


按照您的指示操作后,我收到了一个新的错误信息:2>COPY 失败: 无法解析作用域路径 ..\ClassLibrary2\ClassLibrary2.csproj (): evalSymlinksInScope: \?\C:\ProgramData\Docker\tmp\ClassLibrary2\ClassLibrary2.csproj 不在 \?\C:\ProgramData\Docker\tmp\docker-builder380976981 中。可能的原因是构建上下文之外的禁止路径。 2>c:\users\theUser\source\repos\webapplication4\dockerfile : error CTC1014: Docker 命令以退出代码 1 失败。 - TrevorBrooks
重复添加> Docker支持。这将保持Dockerfile更新。 - Ziaullah Khan

0

前往Docker桌面设置 - 在选项Docker引擎中 - 列表项

添加以下行

"dns": ["10.1.2.3", "8.8.8.8"] 在此条目之前不要忘记添加",", 问题将得到解决


目前的回答表达不够清晰。请[编辑]以添加更多细节,帮助其他人理解这个回答是如何解决问题的。您可以在帮助中心找到更多关于如何写出好回答的信息。 - undefined

0

如果您无法访问NuGet终端节点,那么我会好奇以下两件事情:

  1. 也许您根本不想访问
  2. 您的所有依赖项都存储在私有仓库中(另一个终端节点)

如果上述1和2中的任何一项或两项都是真实的,并且您有一个NuGet.Config文件来管理依赖项,则请尝试从*.csproj文件中删除任何硬编码的包引用,然后再次尝试docker build

如果您没有NuGet.Config文件,并且仍然直接从*.csproj文件引用项目包,则建议创建一个并从项目文件本身中删除这些引用。即使不是为了Docker目的,也至少是为了良好的组织/关注点分离。

最后,请确保NuGet.Config文件与您的Dockerfile处于同一目录级别。 Dockerfile将不会“看到”其同一目录级别之外的任何内容(即使您在Dockerfile中使用正确的相对路径,以便它可以在理论上看到它们,如果它按照这种方式工作)。


0

我在使用dotnet restore时遇到了类似的问题,导致出现无法加载源https://api.nuget.org/v3/index.json的服务索引

对我来说,解决方案是在Docker Engine设置中设置dns,正如这里的一个答案所描述的那样:Docker容器无法解析主机


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接