docker - Dockerize dotnet core 2.2 应用程序,nopCommerce Dockerfile 中放置了什么以及为什么行?
问题描述
关于 dockerizing dotnet core app 的问题
作为示例,我将为 nopCommercew https://github.com/nopSolutions/nopCommerce/blob/develop/Dockerfile提供 Dockerfile
一切都很清楚,除了以下几点:
RUN dotnet publish Nop.Web.csproj -c Release -o /app/published
...
# add globalization support
RUN apk add --no-cache icu-libs
ENV DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=false
WORKDIR /app
RUN mkdir bin
RUN mkdir logs
COPY --from=build /app/published .
- 为什么要把app发布到
/app/published
,然后复制到/app
? - 为什么要
--from=build
在行中使用COPY --from=build /app/published .
? - 这条线
RUN apk add --no-cache icu-libs
是干什么用的?为什么要使用它?
解决方案
Docker 镜像是一堆较小的层。
在docker build .
每个逻辑步骤创建多个小型 docker 图像并将其缓存。仔细检查 docker build 输出并Using cache
在输出中查找。
检查输出
docker pull mcr.microsoft.com/dotnet/core/runtime:3.1 docker images docker inspect <image id of mcr.microsoft.com/dotnet/core/runtime:3.1>
#The Answer 有两个FROM
docker 命令。第一个命令指向.NET Core SDK
可能是 600 MB。
第二个命令指向.NET Core runtime
的可能是 200 MB。
SDK 映像供开发人员构建/测试/打包。它支持所有dotnet
可用的 CLI 命令。比如dotnet build
和dotnet publish
。
运行时映像针对生产进行了优化。它们更小,因此更快。
对于高效的构建过程,docker 建议使用多个图像。SDK 和运行时。
###1:为什么要把应用发布到/app/published,然后复制到/app?
该dotnet publish
命令属于 SDK 镜像周期。/app/publish
拥有运行应用程序所需的一切,但在 SDK 映像上。
我们需要将它带到运行时映像。
WORKDIR /app 在运行时映像中创建一个文件夹。
###2:为什么在 COPY --from=build /app/published 行中使用 --from=build 。?
在上述步骤之后,发布命令的输出可在 /app/publish 文件夹中的 SDK docker 映像上使用。
我们在 Dockerfile 的第一行通过AS build
在命令末尾传递来将其称为“构建”
FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build
--from==build
我们指向 SDK 映像并将其复制到运行时映像。这是用于两个 docker 镜像之间的通信。
###3: RUN apk add --no-cache icu-libs 这一行是干什么用的?为什么要使用它?
该 apk 用于在 Linux 操作系统上安装软件包。将其视为等效于 .net 的 nuget。
icu-libs
是 Unicode 字符的 Linux 包。
https://pkgs.alpinelinux.org/package/v3.3/main/x86/icu-libs
我假设 nopCommerce 支持 Unicode 字符。mcr.microsoft.com/dotnet/core/runtime:3.1
安装了可能不支持 Unicode 的 Debian Linux 版本 4 。通过 APK 命令 nopCommerce 正在手动安装它。
推荐阅读
- sql - 删除 1.3 亿行
- spring - 我应该如何在 Spring Boot 中运行前端集成测试?
- python - 一定范围内的编码和解码
- composer-php - 如何查找和处理不在我的 composer.json 中的过时 composer 包的原因?
- java - MainActivity 中的按钮,DialogFragment 中的重置微调器
- bash - 提交后在 Slurm 中添加 Job Array 元素
- javascript - 为什么这个 JS 代码在 Windows 上写入漏洞文件的速度如此之慢?
- vue.js - 将按钮绑定到模型?
- android - Android 中的 Ionic Cordova 应用程序链接 + 相机插件意图问题
- javascript - vue计算属性无法获取数据