【问题标题】:Dockerize dotnet core 2.2 app, what and why lines are placed in nopCommerce Dockerfile?Dockerize dotnet core 2.2 应用程序,nopCommerce Dockerfile 中放置了什么以及为什么行?
【发布时间】:2020-06-30 07:42:28
【问题描述】:

关于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=buildCOPY --from=build /app/published .行中使用?
  3. RUN apk add --no-cache icu-libs 这一行是干什么用的?为什么要使用它?

【问题讨论】:

    标签: docker .net-core devops nopcommerce


    【解决方案1】:

    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>

    #答案 有两个FROM docker 命令。 第一个命令指向.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 手动安装。

    【讨论】:

    • 我对以下两行 RUN mkdir bin RUN mkdir logs 有更多顾虑,我们为什么要把它们放在适当的位置?
    • Dockerfile 是一组 docker 引擎的指令。这些指令可以做很多事情。比如 COPY 从本地计算机到内部 docker 图像。 RUN 在 docker 中运行一个命令。这两个运行命令正在创建文件夹。 mkdir是linux创建director的命令。告诉 Docker 在 docker linux 容器中运行 mkdir Dockerfile 命令是 RUN 所以集体效果是在 docker 内部创建了一个文件夹。
    猜你喜欢
    • 1970-01-01
    • 2022-08-22
    • 2023-03-22
    • 1970-01-01
    • 2019-10-14
    • 2022-11-06
    • 2011-02-09
    • 2020-01-16
    • 1970-01-01
    相关资源
    最近更新 更多