Dockerfile无法查看本地文件或私有nuget服务器

时间:2018-02-16 07:29:39

标签: c# visual-studio docker nuget

我正在尝试在容器技术上启动我的.net核心web api。使用docker。

环境= Windows 10,Visual Studio

Docker版本:

  

客户端:

     

版本:17.12.0-ce

     

API版本:1.35

     

转到版本:go1.9.2

     

Git commit:c97c6d6

     

内置:Wed Dec 27 20:05:22 2017

     

OS / Arch:windows / amd64

     

服务器:

     

发动机:

     

版本:17.12.0-ce

     

API版本:1.35(最低版本1.12)

     

转到版本:go1.9.2

     

Git commit:c97c6d6

     

建造:Wed Dec 27 20:12:29 2017

     

OS / Arch:linux / amd64

     

实验:真的

我的Nuget.Config文件:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
<packageSources>


<add key="nuget.org" value="https://api.nuget.org/v3/index.json" 
protocolVersion="3" />


<add key="Private" 
value="http://My_Private_Nuget_Server" />


</packageSources>
<packageRestore>
<add key="enabled" value="True" />
<add key="automatic" value="True" />
</packageRestore>
<bindingRedirects>
<add key="skip" value="False" />
</bindingRedirects>
<packageManagement>
<add key="format" value="0" />
<add key="disabled" value="True" />
</packageManagement>


<apikeys>
<add key="https://www.nuget.org" value="Some_Long_Value" />
</apikeys>


<disabledPackageSources />
</configuration>

我的Dockerfile:

FROM microsoft/aspnetcore-build:2.0 AS build-env
WORKDIR /app

# Copy csproj and restore as distinct layers
COPY *.csproj ./
RUN dotnet restore

# Copy everything else and build
COPY . ./
RUN dotnet publish -c Release -o out

# Build runtime image
FROM microsoft/aspnetcore:2.0
WORKDIR /app
COPY --from=build-env /app/out .
ENTRYPOINT ["dotnet", "MailAlertWebApiWithEF.dll"]

我在Windows 10机器上使用Linux Container。我在Visual Studio 17上有.net核心项目。当添加docker支持并从VS 17运行时,一切正常。 API在容器内站起来。但是当我关闭VS时不起作用。但是当ı尝试自定义我的dockerfile以使我的图像和容器独立于VS.由于私有.dll,它会出错。

在我的项目中,我的私人nuget服务器上有一个。dll。当我尝试没有我的私人.dllı可以创建图像。但是需要.dll。 Docker给我这个错误:

  

MailAlertWebApiWithEF.csproj:错误NU1101:无法找到包   WebApi.Utils。源中没有包含此ID的包:   nuget.org

我搜索了这个错误。问题的来源似乎是Nuget.Config文件。但它对我来说似乎很好,因为我可以在那里看到我的私人nuget服务器。当ı搜索解决方案箭头总是在Linux机器上,但ı使用Windows。

1-)因此,如果我可以使用VS 17启动我的项目,那么我的nuget.config文件的格式正确。它可以看到我的私人nuget服务器。对?那为什么码头工人看不到呢?

请帮忙

6 个答案:

答案 0 :(得分:9)

为了在容器内运行dotnet命令来查找自定义源,还必须将nuget.config文件复制到容器中。

为此,请将包含私有Feed的nuget.config文件添加到项目文件夹中,然后添加一个将此文件复制到容器的COPY步骤。

示例(Dockerfile):

WORKDIR ...
COPY NuGet.Config /
COPY ... ...

答案 1 :(得分:4)

您可以通过dotnet命令添加私有nuget,而无需链接到nuget.config文件。

COPY *.csproj ./  

RUN dotnet nuget add source <source-value-of-nuget> -n <name> 

RUN dotnet restore 

答案 2 :(得分:3)

对于使用私有存储库自定义nuget feeds RUN dotnet restore >是失败,那么您可以执行以下操作:

仅在以下情况下适用:您的NuGet.Config包含私有回购端点和凭据,然后

1)将系统的NuGet.Config复制到.csproject所在的根目录下。

2)现在在docker文件中将这些语句放在您尝试恢复软件包之前:

COPY ./NuGet.Config ./

3)之后,将配置文件位置附加到dotnet restore命令中,如下所示:

RUN dotnet restore <CS_project_name>.csproj --configfile ./NuGet.Config

4)现在,做剩下的事情。

5)在入口点之前或复制到其他容器之前(如果是多阶段构建),最好删除NuGet.Config ,因为我们不希望那样可以在吊舱/容器中看到

RUN rm ./NuGet.Config

答案 3 :(得分:0)

如果您的“私有nuget提要”可以通过url访问,则可以将Nuget.Config复制到解决方案或项目文件夹中。 但是,如果私有提要是用作nuget源的本地文件夹,则此方法仍然会失败,并出现以下错误:文件夹不在构建上下文之外,或者仅仅是因为Docker构建过程无法解析Windows路径。

例如如果您Nuget.Config的内容如下:

  <packageSources>
    <add key="nuget.org" value="https://api.nuget.org/v3/index.json" protocolVersion="3" />
    <add key="My Local" value="C:\dev\nuget-packages" />
  </packageSources>

Docker上下文将无法解析C:\dev\nuget-packages

诱人的是放弃在docker内部构建,而是仅预发布已编译的解决方案并从中构建映像...

但是也可以使用另一种解决方法,该方法需要更多步骤: 在运行dotnet restore命令之前先运行docker-compose,然后使用--packages选项将还原的软件包保存到解决方案文件夹中 例如

dotnet-restore C:\slnfolder\myproj\myapp.csproj --packages C:\slnfolder\packages

(这可以与docker-compose命令一起包装在单个powershell脚本中。)

然后在Dockerfile中(由docker-compose使用以构建映像),假设上下文是解决方案文件夹,而WORKDIR'/src'

COPY packages/. packages/.

并将Dockerfile恢复行修改为

RUN dotnet restore "myproj/myapp.csproj" -s /src/packages -s https://api.nuget.org/v3/index.json

答案 4 :(得分:0)

在寻找另一个关于nuget的问题/答案时偶然发现了这个问题

要从Docker内部还原,如this answer中所述,首先将nuget.config文件复制到容器中,建议您将其放置在/root/.nuget/NuGet文件夹中,然后使用多阶段Dockerfile ,则无需担心将其删除。

如果有帮助,这是我的设置...

--nuget.config
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <packageSources>
    <add key="PrivateFeed" value="https://private.nuget.feed.net/" />
  </packageSources>
  <packageSourceCredentials>
    <PrivateFeed>
      <add key="Username" value="username" />
      <add key="ClearTextPassword" value="plaintext_password" />
    </PrivateFeed>
  </packageSourceCredentials>
</configuration>

多阶段Dockerfile ...

FROM mcr.microsoft.com/dotnet/core/sdk:3.1.201 as sdk-build
WORKDIR /app

# Skip extraction of XML documentation for nuget packages
ENV NUGET_XMLDOC_MODE=skip

# We'll copy the nuget config file to the right place
# which should mean it doesn't get copied to our deployed containers
# and we can just call 'dotnet restore' with specifying a config file
COPY ./Nuget.Config /root/.nuget/NuGet/NuGet.Config

# Make use of cached layers, by only doing a restore when the config changes
COPY ./*.sln ./**/*.csproj ./

# Then within a RUN command to copy them to the right folders.
RUN for file in $(ls *.csproj); do mkdir -p ${file%.*}/ && mv $file ${file%.*}/; done \
    && dotnet restore

# Copy the source code
COPY . .

# Now do a build/publish here
RUN dotnet publish "./project/project.csproj" --output /app/output


FROM mcr.microsoft.com/dotnet/core/aspnet:3.1.2
WORKDIR /app
COPY --from=sdk-build /app/output ./
ENTRYPOINT ["./project"]

答案 5 :(得分:0)

这个问题不需要复杂的解决方案。 要使您的“dotnet 发布”工作,它需要知道在何处查找 NuGet 包,并且 NuGet 包应该在该位置可用。

因此,您只需要将包含 NuGet 包的文件夹复制到容器中,然后使用以下命令告诉构建实用程序在哪里查找

RUN dotnet nuget add source /repo/nuget-local-source -n local-repo