我有点卡住了,我有一个问题 here 是关于 Docker 容器中缺少 /bin/sh 的问题。我正在为 LINUX 上的 .NET 7.0 寻找正确的 docker 镜像,它可以托管带有嵌入式 ASP.NET OWIN Web 服务器的控制台应用程序,我需要在这里制作自定义镜像吗?他们似乎都没有/bin/sh?
错误:创建垫片任务失败:OCI 运行时创建失败:runc 创建失败:无法启动容器进程:exec:“/bin/sh”:stat /bin/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" ]
你试过微软官方的Docker镜像了吗? 就像这个 -
mcr.microsoft.com/dotnet/aspnet:7.0
.
ASP.NET Core 不需要 OWIN,它使用自己的中间件管道并提供 OWIN 所做的一切。我不确定它可以使用OWIN,还是会干扰ASP.NET Core。
ASP.NET Core 应用程序也是 控制台应用程序,所以开箱即用地解决了这个问题。它们可以很容易地打包成 Docker 镜像。 ASP.NET Core 文档 展示了如何手动添加 Dockerfile 来构建和打包 Web 应用程序,但这也可以通过 使用项目模板设置.
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 应用程序。
.NET 7 可以直接发布到 Docker 镜像,消除了 Dockerfile。您可以通过单个配置文件切换来做您想做的事。
从博客示例中,您可以创建一个 MVC 应用程序
# 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