我正在尝试在容器技术上启动我的.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服务器。对?那为什么码头工人看不到呢?
请帮忙
答案 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