如何解决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 软件包。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。