【问题标题】:Dockerfile copy folder to restore local nuget packagesDockerfile 复制文件夹以恢复本地 nuget 包
【发布时间】:2021-06-03 23:06:48
【问题描述】:

我想从一个单元测试项目的 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", "Oncolin.DataAccess.WebAPI/nugetPackages"]-> failed, 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' .

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

提前致谢

【问题讨论】:

    标签: docker continuous-integration dockerfile nuget nuget-package-restore


    【解决方案1】:

    我找到了复制本地 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 包。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多