Dockerize dotnet core 2.2 应用程序,什么以及为什么行放在 nopCommerce Dockerfile 中?

Dockerize dotnet core 2.2 app, what and why lines are placed in nopCommerce Dockerfile?

关于 dockerizing dotnet core app 的问题

作为示例,我将为 nopCommercew 提供 Dockerfile https://github.com/nopSolutions/nopCommerce/blob/develop/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 .
  1. 为什么要将应用发布到 /app/published,然后将其复制到 /app
  2. 为什么--from=build行用在第COPY --from=build /app/published .行?
  3. 这条线RUN apk add --no-cache icu-libs是做什么用的?为什么要使用它?

Docker 图像是一堆较小的图层。

docker build . 在每个逻辑步骤创建多个小 docker 图像并将其缓存。仔细检查 docker 生成输出并在输出中查找 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>

#答案 有两个 FROM docker 命令。 第一个命令指向 .NET Core SDK,可能是 600 MB。

第二个命令指向 .NET Core runtime,大概是 200 MB。

SDK 映像供开发人员使用 build/test/package。它支持所有 dotnet CLI 命令,可在此处获得。比如dotnet builddotnet publish.

运行时图像针对生产进行了优化。它们更小,因此更快。

为了高效的构建过程,docker 建议使用多个图像。 SDK 和 运行时间。

###1:为什么要把app发布到/app/published,然后复制到/app?

dotnet publish指令为SDK镜像循环。 /app/publish 拥有 运行 您的应用程序所需的一切,但在 SDK 映像上。

我们需要把它带到 运行 时间图像。

WORKDIR /app 在 运行time 图像中创建一个文件夹。

###2: 为什么在 COPY --from=build /app/published .?

行中使用 --from=build

在上述步骤之后,发布命令的输出在 /app/publish 文件夹中的 SDK docker 图像上可用。

我们通过在命令末尾传递 AS build 在 Docker 文件的第一行将其称为“构建”

FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build

--from==build我们指向SDK镜像并将其复制到运行time镜像。这是两个 docker 图像之间的通信。

###3: 这行 运行 apk add --no-cache icu-libs 是做什么用的?为什么要使用它?

apk 用于在 Linux OS 上安装软件包。认为它相当于.net的nuget。

icu-libs 是一个 Linux Unicode 字符包。

https://pkgs.alpinelinux.org/package/v3.3/main/x86/icu-libs 我假设 nopCommerce 支持 Unicode 字符。 mcr.microsoft.com/dotnet/core/runtime:3.1 安装 Debian Linux 可能是版本 4,它不支持 Unicode。 通过 APK 命令 nopCommerce 正在手动安装它。