原文网址:https://zhuanlan.zhihu.com/p/222977899?utm_source=ZHShareTargetIDMore
Docker 技术使用 Dockerfile 文件里的指令来定义构建容器镜像(image)的过程,然后 Docker 使用 docker build 命令来执行镜像的构建。
Docker 引擎使用镜像来启动容器,一个典型的容器包含容器的操作系统以及运行在其上的应用,因此 Dockerfile 的里的指令首先就是要定义一个基础镜像(当然你也可以使用 FROM scratch 来从零开始构建一个镜像),这个镜像通常是一个操作系统,比如本例中的 aspnet:3.1-buster-slim 就是一个已经安装了 http://asp.net core 运行时的 Debian 10.5 "buster" 操作系统,其中的 slim 指的是这个操作系统是一个专门为容器定制的“瘦身”版本。
除了基础镜像, Dockerfile 还需要为镜像添加应用,这个应用可以是直接拷贝到镜像内的或者在镜像内部生成的,本例就是使用了一个包含了 .net core sdk 的基础镜像来生成我们的应用,然后将最终生成的内容拷贝到最终的基础镜像中。
最后 Dockerfile 还要为镜像设置一个入口命令行(ENTRYPOINT)作为镜像容器启动后执行的命令,这类似于编程语言里的入口函数。
下面就是项目中添加的默认 Dockerfile,每个步骤都做了注释。
#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging.
#引入aspnet:3.1-buster-slim镜像并重命名为 base
FROM http://mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS base
#设置base镜像的工作目录为/app
WORKDIR /app
#开放容器的80与443端口
EXPOSE 80
EXPOSE 443
#引入sdk:3.1-buster镜像并重命名为build
#该镜像用于在Linux平台上生成我们的项目并不包含在最终镜像中
FROM http://mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build
#设置build镜像的工作目录为/src
WORKDIR /src
#拷贝项目文件DemoWeb.csproj到/src/DemoWeb/目录
COPY ["DemoWeb/DemoWeb.csproj", "DemoWeb/"]
#运行dotnet restore命令还原项目的依赖
RUN dotnet restore "DemoWeb/DemoWeb.csproj"
#拷贝Dockerfile所在目录的内容到/src目录
COPY . .
#设置工作目录为build镜像的/src/DemoWeb
WORKDIR "/src/DemoWeb"
#运行 dotnet build 生成命令,并将输出内容保存到/app/build目录
RUN dotnet build "DemoWeb.csproj" -c Release -o /app/build
FROM build AS publish
#运行 dotnet publish 发布命令,并将输入内容保存到/app/publish目录
RUN dotnet publish "DemoWeb.csproj" -c Release -o /app/publish
#使用base镜像最为最终的基础镜像
FROM base AS final
WORKDIR /app
#将publish镜像中/app/publish目录的内容拷贝到当前的/app目录
COPY --from=publish /app/publish .
#设置该镜像的入口命令为 dotnet DemoWeb.dll
ENTRYPOINT ["dotnet", "DemoWeb.dll"]
【可能的坑和建议】
这里的 Dockerfile 使用的镜像 Tag 里的版本号只有两位,所以在小版本号更新后,如果镜像仓库中对应 Tag 的镜像更新了,你将需要重新 pull 该镜像,这会导致重新下载,由于 mcr.microsoft.com 的镜像拉取非常慢,所以在你并不需要更新的时候这会很麻烦。
所以个人推荐在 FROM 镜像的时候使用更确切的版本以确保之后不会在不必要的时候更新。如下面的 Dockerfile 所示将 aspnet:3.1-buster-slim 改为 aspnet:3.1.7-buster-slim,以及 sdk:3.1-buster 改为 sdk:3.1.401-buster 以确保在后续构建中这些基础镜像不会自动更新。查阅这些具体 tag 清单的页面的链接可以在这些镜像的 Docker hub 主页中找到:
以下就是使用了确切版本号镜像 tag 的 Dockerfile,
#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging.
FROM http://mcr.microsoft.com/dotnet/core/aspnet:3.1.7-buster-slim AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443
FROM http://mcr.microsoft.com/dotnet/core/sdk:3.1.401-buster AS build
WORKDIR /src
COPY ["DemoWeb/DemoWeb.csproj", "DemoWeb/"]
RUN dotnet restore "DemoWeb/DemoWeb.csproj"
COPY . .
WORKDIR "/src/DemoWeb"
RUN dotnet build "DemoWeb.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "DemoWeb.csproj" -c Release -o /app/publish
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "DemoWeb.dll"]
标签:app,publish,了解,build,dotnet,镜像,DemoWeb,Dockerfile
From: https://www.cnblogs.com/bruce1992/p/17035423.html