docker 无法从其他gitlab项目获取nuget包(错误NU1301)

bmp9r5qi  于 2024-01-06  发布在  Docker
关注(0)|答案(2)|浏览(215)

我在本地安装了Gitlab。我有两个项目:一个工具包(项目1)和第二个项目(项目2),第二个项目使用的是第一个项目的nuget包。nuget包存储在项目1的Gitlab包注册表中。
我想创建一个项目2的Docker映像,并将其存储在项目2的Gitlab容器注册表中。
我的gitlab-ci.yml文件如下:

  1. stages:
  2. - deploy
  3. deploy-solution:
  4. stage: deploy
  5. image: docker:20.10.16
  6. services:
  7. - docker:20.10.16-dind
  8. before_script:
  9. - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
  10. script:
  11. - docker build --pull -t $CI_REGISTRY_IMAGE --build-arg TOKEN=$CI_JOB_TOKEN --no-cache .
  12. - docker push $CI_REGISTRY_IMAGE
  13. only:
  14. - main

字符串
我的nuget.config文件如下:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <configuration>
  3. <packageSources>
  4. <clear />
  5. <add key="gitlab" value="https://<localdomain>/api/v4/projects/<project1_id>/packages/nuget/index.json" />
  6. <add key="nuget" value="https://api.nuget.org/v3/index.json" />
  7. </packageSources>
  8. <packageSourceCredentials>
  9. <gitlab>
  10. <add key="Username" value="gitlab-ci-token" />
  11. <add key="ClearTextPassword" value="$TOKEN_ENV" />
  12. </gitlab>
  13. </packageSourceCredentials>
  14. </configuration>


我的Dockerfile文件如下:

  1. FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
  2. WORKDIR /app
  3. EXPOSE 80
  4. EXPOSE 443
  5. # Build
  6. FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
  7. ## Certificates SSL
  8. WORKDIR /usr/local/share/ca-certificates/
  9. COPY ["ca.crt", "."]
  10. RUN update-ca-certificates -f
  11. ## Copy sources and build
  12. WORKDIR /src
  13. COPY ["nuget.config", "."]
  14. ARG TOKEN
  15. ENV TOKEN_ENV=$TOKEN
  16. #RUN sed -i "s/PASSWORD/$TOKEN_ENV/" nuget.config <-- By replacing a keyword in the nuget.config file
  17. COPY ["Project2.API/Project2.API.csproj", "Project2.API/"]
  18. RUN dotnet restore "Project2.API/Project2.API.csproj"
  19. COPY . .
  20. WORKDIR "/src/Project2.API"
  21. RUN dotnet build "Project2.API.csproj" -c Release -o /app/build
  22. # Publish
  23. FROM build AS publish
  24. RUN dotnet publish "Project2.API.csproj" -c Release -o /app/publish /p:UseAppHost=false
  25. # Deploy
  26. FROM base AS final
  27. WORKDIR /app
  28. COPY --from=publish /app/publish .
  29. ENTRYPOINT ["dotnet", "Project2.API.dll"]


gitlab-ci.yml文件docker build --pull -t $CI_REGISTRY_IMAGE --build-arg TOKEN=$CI_JOB_TOKEN --no-cache .中的命令将标记$CI_JOB_TOKEN作为参数传递。该标记在Dockerfile中检索并存储在环境变量中。该环境变量在nuget.config文件中用作$TOKEN_ENV
使用RUN dotnet restore "Project2.API/Project2.API.csproj"命令恢复项目1的nuget包时,显示以下错误:

  1. error NU1301: Unable to load the service index for source https://<localdomain>/api/v4/projects/<project1_id>/packages/nuget/index.json. [/src/Project2.API/Project2.API.csproj]


我还尝试用RUN sed -i "s/PASSWORD/$TOKEN_ENV/" nuget.config命令替换nuget.config文件中的关键字(参见Dockerfile above) after copying the nuget.config文件中的注解行,以及在用该标记填充环境变量之后)。

  1. <add key="ClearTextPassword" value="PASSWORD" />


阅读文件后发现关键字被替换为[MASKED],而不是标记,所以我仍然得到同样的错误。
请注意,项目2对项目1有一个令牌访问权限,并且在项目1中有一个Gitlab的配置(项目1 > Settings > CI/CD > Access令牌)。
如何修复错误?

dffbzjpn

dffbzjpn1#

我在gitlab-ci文件中添加了一个stage build,方法是复制stage deploy 中相同的初始步骤:

  • 设置证书;
  • 将字符串替换为作业令牌。

真的有用!
然后,我能够创建一个结果工件,并通过将其复制到Docker镜像中,将其重用到阶段 * 部署 * 中。

  1. artifacts:
  2. paths:
  3. - publish/

字符串
因此,我能够避免依赖恢复(导致问题),Dockerfile中的构建和发布,这通过端口暴露,复制应用程序(工件)和添加入口点的步骤来简化。

  1. FROM mcr.microsoft.com/dotnet/aspnet:6.0
  2. WORKDIR /app
  3. EXPOSE 80
  4. EXPOSE 443
  5. COPY publish .
  6. ENTRYPOINT ["dotnet", "OrderService.API.dll"]


总之,工件的使用允许我解决问题并更好地组织步骤。

展开查看全部
6jygbczu

6jygbczu2#

去你的%appdata%\NuGet和抛光NuGet.config -它可能是你有一些冗余的设置。

相关问题