作为示例,我将为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 .
/app/published
,然后将其复制到/app
?--from=build
中使用COPY --from=build /app/published .
?RUN apk add --no-cache icu-libs
这行是做什么用的?以及为什么要使用它?谢谢!
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 build
和dotnet publish
。
运行时映像针对生产进行了优化。它们较小,因此速度更快。
为了获得有效的构建过程,码头工人建议使用多个图像。 SDK和运行时。
1:为什么将应用发布到/ app / published,然后将其复制到/ app?
dotnet publish
命令属于SDK映像周期。 /app/publish
具有运行您的应用程序所需的所有功能,但位于SDK映像上。我们需要将此作为运行时映像。
WORKDIR / app在运行时映像中创建一个文件夹。
2:为什么在COPY行中使用--from = build --from = build / app / published。?
我们通过在命令末尾传递AS build
在Dockerfile的第一行将其称为“构建”
FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build
使用--from==build
,我们指向SDK映像并将其复制到运行时映像。这是用于两个docker映像之间的通信。
3:这行RUN apk add --no-cache icu-libs是做什么用的?以及为什么要使用它?
[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正在手动安装它。
希望这可以解释您的所有问题。