使用Docker容器化.NET 7.0控制台和ASP.NET应用程序?

toiithl6  于 2023-03-29  发布在  Docker
关注(0)|答案(1)|浏览(202)

我有一点卡住了,我有一个问题,在这里是围绕失踪/bin/sh在Docker容器.我正在寻找正确的docker镜像为.NET 7.0在LINUX上,可以托管一个控制台应用程序与嵌入式ASP.NET OWIN Web服务器,我需要在这里做一个自定义的?他们似乎都没有/bin/sh?
错误:无法创建填充任务:OCI运行时创建失败:runc创建失败:无法启动容器进程:exec:“/bin/sh”:统计/分组/sh:没有这样的文件或目录:未知的
下面是我的Docker文件:

FROM ubuntu/dotnet-aspnet:7.0-22.10_edge

COPY . .

RUN dotnet publish "./RaspCronJobServer/RaspCronJobServer.csproj" -o /application

WORKDIR /application

EXPOSE 5000

ENTRYPOINT [ "dotnet", "RaspCronJobServer.dll" ]
7gcisfzg

7gcisfzg1#

看起来真实的的问题是如何使用Chiseled Ubuntu容器映像。dotnet-aspnet:7.0-22.10_edge是Chiseled映像的名称,而不是常规映像。
正如链接的博客文章所解释的那样,这些基本上是无发行版映像,剥离到最基本的部分。没有shell或应用程序本身不直接需要的任何东西。构建应用程序仍然需要常规的SDK映像,但最终目标将是chiseled映像。
从使用凿刻容器图像的例子中,Dockerfile应该看起来像这样:

FROM mcr.microsoft.com/dotnet/sdk:7.0-jammy AS build
WORKDIR /source

# copy csproj and restore as distinct layers
COPY *.csproj .
RUN dotnet restore --use-current-runtime

# copy and publish app and libraries
COPY . .
RUN dotnet publish -c Release -o /app --use-current-runtime --self-contained false --no-restore

# final stage/image
FROM mcr.microsoft.com/dotnet/nightly/runtime:7.0-jammy-chiseled
WORKDIR /app
COPY --from=build /app .
ENTRYPOINT ["dotnet", "dotnetapp.dll"]

这将正常构建应用程序,但将其打包在Chiseled图像中,而不是普通的runtime图像中。

原始答案

简短版本:您已经可以将ASP.NET Core 7 Web应用直接发布到Docker:

dotnet publish --os linux --arch x64 -c Release -p:PublishProfile=DefaultContainer

ASP.NET Core不需要OWIN,它使用自己的中间件管道并提供OWIN所做的一切。我不确定它是否可以使用OWIN,或者它会干扰ASP.NET Core。
ASP.NET Core应用程序 * 也是 * 控制台应用程序,因此问题可以开箱即用地解决。它们可以轻松地打包到Docker映像中。ASP.NET Core文档展示了如何手动添加Dockerfile来构建和打包Web应用程序,但也可以通过using project template settings完成。
Dockerfile使用SDK镜像构建应用程序,并将输出复制到基于Runtime镜像的新镜像。这确保了最终镜像尽可能小:

# https://hub.docker.com/_/microsoft-dotnet
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /source

# copy csproj and restore as distinct layers
COPY *.sln .
COPY aspnetapp/*.csproj ./aspnetapp/
RUN dotnet restore

# copy everything else and build app
COPY aspnetapp/. ./aspnetapp/
WORKDIR /source/aspnetapp
RUN dotnet publish -c release -o /app --no-restore

# final stage/image
FROM mcr.microsoft.com/dotnet/aspnet:6.0
WORKDIR /app
COPY --from=build /app ./
ENTRYPOINT ["dotnet", "aspnetapp.dll"]

实际的发布命令是dotnet publish -c release -o /app --no-restore。如果需要,您可以创建单个文件可执行文件,但由于您使用容器,因此可以使用dotnet aspnetapp.dll来运行Web应用程序。

直接发布到Docker

.NET 7可以publish directly to Docker images,消除了Dockerfile。你可以用一个配置文件开关做你想做的事情。
在博客示例中,您可以使用

# create a new project and move to its directory
dotnet new mvc -n my-awesome-container-app
cd my-awesome-container-app

# add a reference to a (temporary) package that creates the container
dotnet add package Microsoft.NET.Build.Containers

并将其发布到Docker

# publish your project for linux-x64
dotnet publish --os linux --arch x64 -c Release -p:PublishProfile=DefaultContainer

相关问题