首页 > 其他分享 > 了解 Dockerfile

了解 Dockerfile

时间:2023-01-08 21:35:10浏览次数:54  
标签:app publish 了解 build dotnet 镜像 DemoWeb Dockerfile

原文网址: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

相关文章

  • P15_了解小程序的版本阶段与上线的主要步骤
    协同工作和发布-小程序的版本软件开发过程中的不同版本在软件开发过程中,根据时间节点的不同,会产出不同的软件版本,例如:开发者编写代码的同时,对项目代码进行自测(开发......
  • 机器学习技术系列:一篇图文笔记了解【机器学习基础知识】
    导言最近有小半年由近半数工作和生活时间在机器学习技术(ML)的学习与工程实践中,感觉自己阅读了几本ML方面好书,找到了一些更好的学习网站,所以重新梳理了一下自己理解的的ML基......
  • tcpdump高级使用和TCP/IP协议了解
    1.打印数据长度大于0的数据包ToprintallIPv4HTTPpacketstoandfromport80,i.e.printonlypacketsthatcontaindata,not,forexampl......
  • DockerFile
    一个简单的示例FROMalpine:latestMAINTAINERsongyanCMDecho'hellodocker'创建镜像dockerbuild-thello_docker-ftest.dockerFile.运行这个镜像docke......
  • Docker(五):Dockerfile基础指令
    参考地址:https://blog.csdn.net/weixin_43526371/article/details/126332507  构建三部曲编写Dockerfile使用dockerbuild命令从Dockerfile构建图像dockerrun......
  • 35_Java中的设计模式简单了解
    Java中的设计模式注意:只是简单了解设计模式(Designpattern)​ 是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用......
  • XML简单了解
    XML一、XML基础1、XML概述:​ XML的全称为(ExtensibleMarkupLanguage),是一种可扩展的标记语言​ 标记语言:通过标签来描述数据的一门语言(标签有时我......
  • 20 张图带你全面了解 HTTPS 协议,再也不怕面试问到了!
    本文详细介绍了HTTPS相较于HTTP更安全的原因,包括对称加密、非对称加密、完整性摘要、数字证书以及SSL/TLS握手等内容,图文并茂、理论与实战结合、建议收藏!1.不安......
  • .Net Core 用自动生成Dockerfile的坑
    简介  之前采用shell脚本+dockerfile的方式构建项目,后来发现Docker在17.05版本之后有多阶段构建方式,该文主要记录了netcore采用dockerfile构建遇到的坑。原先的方式......
  • 初略了解常用寄存器
    常用寄存器对应表寄存器名字含义EAXAccumulatorRegister累加器寄存器EBXBaseRegister基址寄存器ECXCounterRegister计数器寄存器EDXDataRe......