当前位置: 首页 > 知识库问答 >
问题:

.NET核心控制台应用程序不会在基于Alpine的docker映像中启动

尉迟默
2023-03-14

几个月前,我为控制台应用程序创建了第一个Dockerfile。这个控制台应用程序依赖于其他几个c#项目,因此它比您通常在互联网上找到的标准示例要复杂一些。Dockerfile“工作”,即我可以创建图像并运行容器。然而,我知道它有几个缺陷,现在是时候改进这个Dockerfile了。当前版本为

FROM mcr.microsoft.com/dotnet/runtime:6.0 AS base
WORKDIR /app

FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src

COPY Directory.Build.props .
COPY src/ .

RUN dotnet restore "MyProject/MyProject.csproj"
COPY . .
WORKDIR "/src/MyProject"
RUN dotnet build "MyProject.csproj" -c Release -o /app/build --no-restore

FROM build AS publish
RUN dotnet publish "MyProject.csproj" -c Release -o /app/publish --no-restore

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

显然,需要解决文件的多次复制问题,但首先我想通过使用Alpine图像来减小图像大小。基于Microsoft示例中的示例

#参见https://aka.ms/containerfastmode,了解Visual Studio如何使用这个docker文件来构建您的映像,以便更快地进行调试。

FROM mcr.microsoft.com/dotnet/runtime:6.0-alpine-amd64 AS base
WORKDIR /app

FROM mcr.microsoft.com/dotnet/sdk:6.0-alpine AS build
WORKDIR /src

COPY Directory.Build.props .
COPY src/ .

RUN dotnet restore "MyProject/MyProject.csproj" -r linux-musl-x64
COPY . .
WORKDIR "/src/MyProject"
RUN dotnet build "MyProject.csproj" -c Release -o /app/build --no-restore

FROM build AS publish
RUN dotnet publish "MyProject.csproj" -c Release -o /app/publish -r linux-musl-x64 --self-contained false --no-restore

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["./MyProject"]

使用修改后的 Dockerfile,我可以构建一个容器,但它不会启动。也没有日志。按照导出和提取容器的方法,我看到文件夹“app”与原始版本中的文件数量相同,除了原始版本具有额外的文件夹“运行时”。那么修改后的版本有什么问题呢?是否有任何建议可以减小图像的大小?

(PS,我已经更新了问题,以包括建议的修复。)

共有1个答案

毕魁
2023-03-14

我很确定问题出在这一行:

RUN dotnet publish "MyProject.csproj" -c Release -o /app/publish --no-restore

您没有像在< code>dotnet restore命令中那样在这里包含< code>linux-musl-x64 RID。

您应该将其更改为:

RUN dotnet publish "MyProject.csproj" -c Release -o /app/publish -r linux-musl-x64 --self-contained false --no-restore

这在中有说明。https://github . com/dot NET/dot NET-docker/blob/90ada 36795 a 870 FB 0113 de 7406 a 683 ed 05 a 2057 f/samples/dotnetapp/docker file . alpine-x64 # L11:

RUN dotnet publish -c Release -o /app -r linux-musl-x64 --self-contained false --no-restore
 类似资料:
  • 我试着把这个项目作为一个正常的参考。但是在重新构建解决方案之后,控制台应用程序仍然没有将.NET核心库作为参考。

  • ASP.NETCore支持一个新的配置系统,如下所示:https://docs.asp.net/en/latest/fundamentals/configuration.html 也支持这种模式吗?NET核心控制台应用程序? 如果不是,什么是替代以前的和模型?

  • 问题内容: 我正在尝试在Docker容器中运行.net core 1.0.0控制台应用程序。 当我从计算机上的Demo文件夹中运行命令时,它可以正常工作;但是当使用运行时,容器会立即退出。 我试图检查日志,它只是显示Console.WriteLine中的文本: 演示应用正在运行… 没什么 我已经将项目上传到https://github.com/learningdockerandnetcore/De

  • 用于控制台应用程序项目目标。NETCore1.0,我不知道如何获得一个。exe在生成过程中输出。该项目在调试中运行良好。 我已经尝试过发布这个项目,但也不起作用。这是有意义的,因为EXE文件是特定于平台的,但必须有一种方法。我的搜索只找到了对旧版本的引用。使用project的NET核心版本。json。 每当我构建或发布时,这就是我得到的全部:

  • 问题内容: 在创建新的ASP.NET Core MVC应用程序时,特别是与React / Redux(或其他必需的Node.js)模板一起使用时,正确使用的Docker映像是什么?如果不是特定的映像,对于由ASP.NET Core MVC支持的Node.js应用程序,应在Dockerfile中遵循哪些命令或过程? 除了运行支持的MVC网站外,我不需要框架的SDK版本。 运行时映像未安装Node.j

  • 问题内容: 我从openjdk:8-jdk-alpine创建了一个docker镜像,但是当我尝试执行简单的命令时出现以下错误: 问题答案: 默认情况下,高山docker映像未安装bash。您将需要添加以下命令来获取: 如果您使用,那么您可以 保持docker映像大小较小。(感谢@sprkysnrky的评论)