首页 > 解决方案 > 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 .
  1. 为什么要把app发布到/app/published,然后复制到/app
  2. 为什么要--from=build在行中使用COPY --from=build /app/published .
  3. 这条线RUN apk add --no-cache icu-libs是干什么用的?为什么要使用它?

标签: docker.net-coredevopsnopcommerce

解决方案


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 有两个FROMdocker 命令。第一个命令指向.NET Core SDK可能是 600 MB。

第二个命令指向.NET Core runtime的可能是 200 MB。

SDK 映像供开发人员构建/测试/打包。它支持所有dotnet可用的 CLI 命令。比如dotnet builddotnet 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 正在手动安装它。


推荐阅读