asp.net-core - 为 C# 核心构建的 Docker 需要互联网连接
问题描述
我正在使用 C# .NET 核心(VS 2017)编写,使用 linux 容器的构建,使用 docker-compose。
当我构建图像(或发布)时,由于使用了 nuget,总是会引用 Internet。
遇到的最后一个错误(我认为 nuget 会停机,但无论如何 - 任何停机时间都不应导致构建/发布异常)。
/usr/share/dotnet/sdk/2.1.503/NuGet.targets(114,5):错误:无法加载源https://api.nuget.org/v3/index.json的服务索引。...
我想建镜像,连nuget都down了,甚至连interet都没有了
yml 文件如下所示:
services:
myProj:
image: my_proj
build:
context: ./all_projects/base_solution/
dockerfile: myProj/Dockerfile
似乎“dotnet publish ...”命令从互联网调用恢复。
如果我使用 --no-restore 运行发布,则代码未编译,但我想从我自己的计算机预构建中恢复 nuget 包。
我该怎么做?没有互联网连接?为什么我应该依靠互联网在每次构建时恢复 nuget?
为什么我不能从我自己的预构建映像中恢复 nuget 包,而且并非总是如此?!从 nuget 获取(实际上 nuget 包在我的代码中不会偶尔更改)。
我可以只从 nuget 复制文件夹,而不是使用“COPY”命令吗?
我做了以下事情:
从使用所有 nuget 包的“通用”项目构建图像。
在内置图像中为新的其他图像添加引用,如下所示:
创建一个新的公共映像:# 没有运行时。
FROM microsoft/dotnet:2.1-sdk AS build
WORKDIR /src
COPY TestDock/TestDock.csproj TestDock/
FROM build AS publish
RUN dotnet publish TestDock.csproj -c Release -o /app
在原始图像中: FROM microsoft/dotnet:2.1-runtime AS base WORKDIR /app
# FROM microsoft/dotnet:2.1-sdk AS build do:
FROM my_common_image AS build
WORKDIR /src
COPY TestDock/TestDock.csproj TestDock/
# Added the following. I tried to copy all, but this doesn't help.
# I persume I can copy part of the common build.
COPY --from=build /app /app
COPY --from=build /src /src
COPY --from=build /usr /usr
FROM build AS publish
RUN dotnet publish TestDock.csproj --no-restore --no-dependecies -c Release -o /app
FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "TestDock.dll"]
我试图添加一个中间图像,Dockerfile 如下:
# This image is base image for all dockers (no need runtime)
# docker build . -f DockerFile_Common -t docker_common
FROM microsoft/dotnet:2.1-sdk AS build
COPY . .
WORKDIR /src/myProj
FROM build AS publish
RUN dotnet publish myProj.csproj -c Release -o /app
RUN dotnet pack /src/myProj.csproj -c Release -o /app
并在我的图像中使用它(我不想使用互联网构建),而不是:
FROM microsoft/dotnet:2.1-sdk AS build
我做了:
FROM docker_common AS build
我还尝试在将workdir设置为解决方案文件夹时添加以下行:“RUN dotnet publish ...”,并标记“Microsoft Visual Studio Offline Packages”(取消标记默认“nuget.org”)。
尽管如此,上述内容仍无法正确构建。
解决方案
对于不使用互联网,您可以按照以下步骤操作。
需要的是在visual studio中发布,如下:
(在命令行中的替代发布)。
dotnet publish myProj.csproj -c Release /p:PublishProfile=Properties\PublishProfiles\
<myprofile>.pubxml /p:PublishDir=<proj_folder>\bin\Release\netcoreapp2.1\publish
或在 Post-build 事件中添加如下一行:
dotnet publish $(ProjectDir)$(ProjectName).csproj -c $(Configuration)
/p:PublishProfile=Properties\PublishProfiles\PublishProfile.pubxml
/p:PublishDir=$(TargetDir)publish --no-build
...在我刚刚做的 Dockerfile 中,需要从相关的发布目录中执行“COPY ...”!
FROM microsoft/dotnet:2.1-runtime
COPY MyProjectFolder/bin/Release/netcoreapp2.1/publish /app
WORKDIR /app
ENTRYPOINT ["dotnet", "myproject.dll"]
推荐阅读
- qt - QML RangeSlider with pivot value
- python - python multiprocessing doesn't start
- karate - Custom Step Definitions for Karate to test Batch
- intellij-idea - How can I import a online JavaDoc to Intellij?
- pyspark - Join on 1 = 1 on pyspark
- menu - 如何打破 Python 上的循环菜单
- json - 使用嵌套结构迭代 JSON
- php - 如何使用 symfony 和意图支付 API 完成我的条带支付?
- javascript - 是否可以构造一个匹配 Grapheme_Cluster_Break=Extend 的 \p JavaScript regexp
- linux - 如何手动安装 VS Code Server(无需 VS Code 再次尝试安装)?