如何在docker中创建和运行.NET Core控制台应用程序

19

我有一个 .NET Core 2.1 控制台应用程序。我想在 Docker 镜像中运行这个控制台应用程序。我对 Docker 还很新,正在努力弄清楚它的使用。

目前,我有一个 Dockerfile,它受到 微软示例 的启发。我的文件实际上看起来像这样:

FROM microsoft/dotnet:2.1-runtime-nanoserver-1709 AS base
WORKDIR /app

FROM microsoft/dotnet:2.1-sdk-nanoserver-1709 AS build
WORKDIR /src
COPY MyConsoleApp/MyConsoleApp.csproj MyConsoleApp/
RUN dotnet restore MyConsoleApp/MyConsoleApp.csproj
COPY . .
WORKDIR /src/MyConsoleApp
RUN dotnet build MyConsoleApp.csproj -c Release -o /app

FROM build AS publish
RUN dotnet publish MyConsoleApp.csproj -c Release -o /app

FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "MyConsoleApp.exe"]

我的问题是:microsoft/dotnet:2.1-runtime-nanoserver-1709、microsoft/dotnet:2.1-sdk和microsoft/dotnet:2.1-runtime之间有什么区别?对于我的.NET 2.1控制台应用程序,我应该使用哪一个?我不确定是a)构建我的控制台应用程序然后部署到Docker镜像还是b)构建一个Docker镜像,获取代码并在镜像本身上构建控制台应用程序。感谢任何帮助。

6个回答

14

如有兴趣了解实际的 Dockerfile 参考:

FROM microsoft/dotnet:2.2-sdk AS build
WORKDIR /app

COPY <your app>.csproj .
RUN dotnet restore <your app>.csproj

COPY . .
RUN dotnet publish -c Release -o out

FROM microsoft/dotnet:2.2-aspnetcore-runtime AS runtime
WORKDIR /app
COPY --from=build /app/out ./

ENTRYPOINT ["dotnet", "<your app>.dll"]

请注意在基础镜像中使用正确的 .NET Core 版本(2.1、2.2 等)。 - Mugen
ENTRYPOINT 也是如此,它会在 "<your app>.dll" 中查找静态的 main 方法(位于 Program.cs 内)。这就是魔法吗? - granadaCoder
1
是的,和你在调试器或命令行中直接运行dll时一样。 - Mugen
首先,它没有起作用。我只是在第二行将/app替换为/source。然后它就起作用了。 - undefined

2
这是关于 .net docker 镜像而不是 Docker 本身的问题。
您可以访问 https://hub.docker.com/r/microsoft/dotnet/,选择特定的镜像并查找 Dockerfile,了解该镜像中构建的软件内容以及不同 Dockerfile 之间的区别。
对于第二个问题,最好是“构建一个 docker 镜像,获取代码,并在镜像本身上构建控制台应用程序”。因此,您需要构建镜像、暴露端口、将代码挂载为卷,并且您的代码通过容器内安装的软件在容器内执行。

0

microsoft/dotnet:2.1-runtime-nanoserver-1709 - 该镜像用于设置 .net 运行时,任何 .net 应用程序都在其下运行。

microsoft/dotnet:2.1-sdk-nanoserver-1709 - 该镜像是用于编译您的 .net core 应用程序的 SDK。

请参考 this blog 了解如何在 Docker 中创建和运行 .net core 控制台应用程序:


0

我对第一个问题的答案是:

microsoft/dotnet:2.1-runtime-nanoserver-1709 是一个 Docker 镜像,您可以在其中运行 .NET Core 应用程序,

microsoft/dotnet:2.1-sdk-nanoserver-1709 则是一个 Docker 镜像,您可以使用它来构建应用程序,也可以在其中运行应用程序。

至于第二个问题,我的答案是:

如果您只想在 Docker 中运行应用程序,请在本地计算机上使用 Visual Studio 构建应用程序(这将是最简单的方法),然后使用 microsoft/dotnet:2.1-runtime-nanoserver-1709 构建 Docker 镜像。


0

我在Github上放了一个示例,演示如何在.net core webapi应用程序中实现此操作,因此对于控制台应用程序来说应该基本相同。

我的Docker文件如下:

https://github.com/MikeyFriedChicken/MikeyFriedChicken.DockerWebAPI.Example

这个做法基本上和你的一样。

为了澄清之前的答案,你的dockerfile正在创建“临时”镜像,这些镜像具有构建软件的能力。一旦所有内容都构建完成,这些镜像就会被删除。

如果你查看dockerfile中的最后几行,你会发现它将构建镜像的输出复制到你的最终镜像中,该镜像基于“microsoft/dotnet:2.1-runtime-nanoserver-1709”,该镜像只包含足够运行你的 .net core 应用程序所需的库和依赖项。


0
对于.NET 7,以下代码有效。
FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build
WORKDIR /source

COPY . .
RUN dotnet restore <your app name>.csproj --disable-parallel
RUN dotnet publish <your app name>.csproj -c Release -o /app --no-restore

FROM mcr.microsoft.com/dotnet/aspnet:7.0
WORKDIR /app
COPY --from=build /app ./

ENTRYPOINT ["dotnet", "<your app name>.dll"]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接