要准备好所有软件包,您需要在构建之前恢复。
要在构建期间拥有所有包,您需要复制这些包。
下面是一个实验形式的例子:
准备工作:
准备好 sdk:docker pull microsoft/dotnet:2.2-sdk。
准备好src/src.csproj:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Newtonsoft.Json" Version="12.0.2" />
</ItemGroup>
</Project>
准备好src/Dockerfile:
FROM microsoft/dotnet:2.2-sdk AS byse
COPY packages /root/.nuget/packages
COPY src src
RUN ls /root/.nuget/packages
WORKDIR /src
RUN dotnet restore
RUN ls /root/.nuget/packages
执行:
恢复包:
docker run --rm -v $(pwd)/src:/src -v $(pwd)/packages:/root/.nuget/packages -w /src microsoft/dotnet:2.2-sdk dotnet restore
构建映像:
docker build -t test -f src/Dockerfile .
期望:
Sending build context to Docker daemon 13.77MB
Step 1/7 : FROM microsoft/dotnet:2.2-sdk AS byse
---> e4747ec2aaff
Step 2/7 : COPY packages /root/.nuget/packages
---> 76c3e9869bb4
Step 3/7 : COPY src src
---> f0d3f8d9af0a
Step 4/7 : RUN ls /root/.nuget/packages
---> Running in 8323a9ba8cc6
newtonsoft.json
Removing intermediate container 8323a9ba8cc6
---> d90056004474
Step 5/7 : WORKDIR /src
---> Running in f879d52f81a7
Removing intermediate container f879d52f81a7
---> 4020c789c338
Step 6/7 : RUN dotnet restore
---> Running in ab62a031ce8a
Restore completed in 44.28 ms for /src/src.csproj.
Removing intermediate container ab62a031ce8a
---> 2cd0c01fc25d
Step 7/7 : RUN ls /root/.nuget/packages
---> Running in 1ab3310e2f4c
newtonsoft.json
Removing intermediate container 1ab3310e2f4c
---> 977e59f0eb10
Successfully built 977e59f0eb10
Successfully tagged test:latest
请注意,ls 步骤已缓存,不会在后续调用中打印。运行docker rmi test进行重置。
第 4/7 步在还原之前运行,并且包已被缓存。
Step 4/7 : RUN ls /root/.nuget/packages
---> Running in 8323a9ba8cc6
newtonsoft.json
这可以解决过多的恢复时间,例如在自动构建期间。
要解决您的网络问题,您可以尝试在解决步骤期间挂载网络补丁而不是本地路径,或者先将公司网络中的文件 robocopy 到本地缓存中。