docker - 使用 .NetCore 的 Docker,我应该使用 SDK 还是运行时映像进行微服务?
问题描述
我对docker很陌生,我想知道。
当您使用许多微服务 (50+) 时。使用运行时映像与 SDK 映像是否仍然相关?
为了使用运行时映像,我需要做一个独立的发布,大约 100MO 大。
拥有50个微服务,数据5GO,拥有独立的应用程序。
在这种情况下获取运行时映像是否值得?
解决方案
运行时映像包含运行时,因此您无需发布自包含。仅当您需要构建时才需要 SDK 。运行时拥有运行所需的一切。如果您发布的是自包含的,则只需要操作系统,因此您的基本映像将只是 alpine 或其他东西,而不是 ASP.NET Core(因为 ASP.NET Core 将包含在应用程序中)。
然后,Docker 进行了构建。因此,执行此操作的典型方法是在映像中构建和发布所有内容,只是在不同的阶段。最终图像基于最后一个阶段,因此您可以在此处引用运行时图像。例如:
FROM mcr.microsoft.com/dotnet/core/aspnet:2.2-stretch-slim AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443
FROM mcr.microsoft.com/dotnet/core/sdk:2.2-stretch AS build
WORKDIR /src
COPY ["MyProject/MyProject.csproj", "MyProject/"]
RUN dotnet restore "MyProject/MyProject.csproj"
COPY . .
WORKDIR "/src/MyProject"
RUN dotnet build "MyProject.csproj" -c Release -o /app
FROM build AS publish
RUN dotnet publish "MyProject.csproj" -c Release -o /app
FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "MyProject.dll"]
每条FROM
线表示一个新阶段。唯一幸存的是最后阶段,所有要做的就是复制已发布的文件并运行应用程序,为您提供最佳大小的图像。但是,使用分阶段构建,构建和发布应用程序所需的所有逻辑都包含在映像中。
推荐阅读
- c# - Xamarin.Forms - Xamarin.Essentials 命名空间缺少 MediaPicker 或 FilePicker 类
- streamlit - 当我折叠/展开标题时,如何防止 Streamlit 小部件被重置
- laravel - 雄辩的关系:从根模型访问所有孙子资源
- python - ValueError:层序 16 的输入 0 与层不兼容:输入形状的预期轴 -1 具有值 24 但
- python - 我怎样才能集成2平方函数?
- python - Bokeh Live Plot 错误 - 泡菜数据 - 解包需要长度为 8 的字符串参数
- c# - 修复搜索过滤器 C# WPF
- spring - 如何通过@RestController中的身份验证方法从登录表单重定向到@Controller中的html文件?
- http-headers - HTTP DELETE 是否需要 Content-Type 和 Accept Headers
- python - 如何让`conda env list`隐藏环境而不删除它?