I try to add (override) a private nuget source to my build script in order to add the user/pw - and keep it out of my source control. What I tried so far:
nuget
is not recognized as command inside the imagedotnet nuget
does not have the command to add additional sourcesdotnet restore
FROM mcr.microsoft.com/dotnet/core/sdk:2.2
RUN apt-get update && apt-get install -y nuget
RUN nuget source Add -Name "Private Feed" -Source ".." -UserName "UserVAR" -Password "PassVAR"
RUN dotnet restore
Answer for year 2023
This code for WebApplication3 works just fine. We use BaGet NuGet server to have a proxy between Nuget.org and our build servers for faster loads of common packages we use.
#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging.
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src
COPY ["WebApplication3/WebApplication3.csproj", "WebApplication3/"]
# !!!IMPORTANT PART HERE !!!
# Add your NuGet server here
RUN dotnet nuget add source https://nuget.yourdomain.com/v3/index.json
# For our purposes, to hide nuget.org behind a NuGet proxy we disable its source, you can skip that
RUN dotnet nuget disable source "nuget.org"
# Just to see if two lines above work
RUN dotnet nuget list source
RUN dotnet restore "WebApplication3/WebApplication3.csproj"
COPY . .
WORKDIR "/src/WebApplication3"
RUN dotnet build "WebApplication3.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "WebApplication3.csproj" -c Release -o /app/publish /p:UseAppHost=false
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "WebApplication3.dll"]
#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging.
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
# !!!IMPORTANT PART HERE !!!
ARG NUGET_USERNAME
ARG NUGET_PASSWORD
ENV NUGET_USERNAME=${NUGET_USERNAME}
ENV NUGET_PASSWORD=${NUGET_PASSWORD}
# Adds this source with basic authentication, other authentication types exist but I'm not sure if they are applicable here in Linux based container
RUN dotnet nuget add source https://nuget.yourdomain.com/v3/index.json --name="Your source name" --username ${NUGET_USERNAME} --valid-authentication-types basic --store-password-in-clear-text --password ${NUGET_PASSWORD}
WORKDIR /src
COPY ["WebApplication3/WebApplication3.csproj", "WebApplication3/"]
RUN dotnet nuget disable source "nuget.org"
# Just to see if two lines above work
RUN dotnet nuget list source
RUN dotnet restore "WebApplication3/WebApplication3.csproj"
COPY . .
WORKDIR "/src/WebApplication3"
RUN dotnet build "WebApplication3.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "WebApplication3.csproj" -c Release -o /app/publish /p:UseAppHost=false
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "WebApplication3.dll"]
My current workaround is to create a copy of the nuget.config
with a packageSourceCredentials
section that contains placeholders for user name and password. I then replace my existing nuget.config
with this file and replace the user name and password with environment variables.
The only drawback is that I need to keep both config files in sync. If I modify my nuget.config
in the project I need to remember to update the copy as well.
nuget.config.template
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<packageSources>
<add key="GitHub private registry" value="https://nuget.pkg.github.com/your_orga/index.json" />
</packageSources>
<packageSourceCredentials>
<GitHub_x0020_private_x0020_registry>
<add key="Username" value="USER" />
<add key="ClearTextPassword" value="PW" />
</GitHub_x0020_nuget_x0020_registry>
</packageSourceCredentials>
</configuration>
Dockerfile
FROM mcr.microsoft.com/dotnet/core/sdk:2.2 AS build-image
ARG NUGET_AUTH_TOKEN
ARG NUGET_USER_NAME
WORKDIR /app
COPY ./My.Project .
# Replace nuget.config
RUN rm nuget.config
COPY ./gitlab-ci/nuget.config.template ./nuget.config
RUN sed -i -e "s/USER/$NUGET_USER_NAME/g" -e "s/PW/$NUGET_AUTH_TOKEN/g" nuget.config
RUN dotnet restore
.gitlab-ci.yml
docker build
--build-arg NUGET_USER_NAME=$NUGET_USER_NAME
--build-arg NUGET_AUTH_TOKEN=$NUGET_AUTH_TOKEN
--tag $CI_REGISTRY/organization/application:$CI_COMMIT_SHA
--file gitlab-ci/Dockerfile
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With