Dockerfile 复制文件夹以恢复本地 nuget 包

问题描述

我想从单元测试项目的 docker 容器中启动 .NET Core WebApi。这些测试将在使用 GitLab 进行持续集成期间运行。
WebApi 项目使用存储在路径为 C:/Temp/nuget 包的文件夹中的本地 nuget 包。该文件夹存在于运行 GitLab 运行程序的服务器上。

C:/Temp/nuget 包
C:/Users/myUser/project/MyProject 带有以下树
- sln
- MyProjectWebAPI
-- dockerfile
- MyProject.Tests
-- 链接到 MyProjectWebAPI 的 dockerfile\

我的 dockerfile 看起来像这样

FROM mcr.microsoft.com/dotnet/core/aspnet:3.1 AS base
workdir /app
EXPOSE 80
EXPOSE 443

FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build
workdir /src
#copying some csproj files
RUN mkdir Oncolin.DataAccess.WebAPI/nugetPackages
#VOLUME "C:/Temp/nuget packages":"Oncolin.DataAccess.WebAPI/nugetPackages" -> Failed,unable to name a volume in a dockerfile so my folder is empty and the dotnet restore Failed
#copY ["C:/Temp/nuget packages","Oncolin.DataAccess.WebAPI/nugetPackages"]-> Failed,can't reach Temp folder (using ../.. and/or finished with '/' gave the same result)
#ADD["C:/Temp/nuget packages",can't reach Temp folder (using ../.. and/or finished with '/' gave the same result)
#RUN cp -r "C:/Temp/nuget packages" Oncolin.DataAccess.WebAPI/nugetPackages -> Failed,can't reach Temp folder
RUN find Oncolin.DataAccess.WebAPI/nugetPackages
RUN dotnet restore "Oncolin.DataAccess.WebAPI/Oncolin.DataAccess.WebAPI.csproj" -s https://api.nuget.org/v3/index.json -s nugetPackages --verbosity n
copY . .
workdir "/src/Oncolin.DataAccess.WebAPI"
RUN dotnet build "Oncolin.DataAccess.WebAPI.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "Oncolin.DataAccess.WebAPI.csproj" -c Release -o /app/publish

FROM base AS final
workdir /app
copY --from=publish /app/publish .
ENTRYPOINT ["dotnet","Oncolin.DataAccess.WebAPI.dll"]

我必须在构建期间将 C:/Temp/nuget 包复制到我的容器中才能成功恢复 nuget 包。正如您在 dockerfile 中看到的那样,我尝试了几种方法

我像这样运行 docker build 命令

C:\Users\myUser\project\MyProject> docker build -t 'oncolin-webapi' --progress plain -f '.\Oncolin.DataAccess.WebAPI\Dockerfile' .

我怎样才能做到这一点? 是否可以检索卷的名称

提前致谢

解决方法

我找到了一种解决方法来复制我的本地 nuget 包:

  • 访问当前用户的 nuget 包文件夹(即 c:\users\myUser.nuget\packages)并将我已知的本地 nuget 包(按照约定均由“rnc”启动)复制到一个新文件夹中在我的解决方案中

          var localPackagesDirPath = Path.Combine(solutionDirPath,"localNugetPackages");
          var localPackagesDir = Directory.CreateDirectory(localPackagesDirPath);
    
          var directories = Directory.GetDirectories(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile),".nuget","packages"),"rnc*");
          foreach (var item in directories)
          {
              var rncDir = new DirectoryInfo(item);
              var srcRncDir = localPackagesDir.CreateSubdirectory(rncDir.Name);
              CopyAll(rncDir,srcRncDir);
          }
    
  • 在构建镜像时复制它

  • 使用本地 nuget 包文件夹来恢复它们

    COPY ["localNugetPackages/","Oncolin.DataAccess.WebAPI/localNugetPackages/"]
    RUN dotnet restore "Oncolin.DataAccess.WebAPI/Oncolin.DataAccess.WebAPI.csproj" -s https://api.nuget.org/v3/index.json -s localNugetPackages --verbosity n
    

这显然不是很好,但它是我找到的实现目标的唯一解决方案。幸运的是,我没有很多本地 nuget 软件包。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...