Docker系列之八:在Dockerfile中使用多段构建Muti-stage build

系列链接

Docker系列之一:Docker介绍及在Ubuntu上安装

Docker系列之二:Docker 入门

Docker系列之三:使用Docker镜像和仓库

Docker系列之四:Dockerfile的使用

Docker系列之五:Volume 卷的使用——以Redis为例

Docker系列之六:Volume 卷的使用——在Dockerfile中的用法

Docker系列之七:Docker 网络(内部网络、容器之间的连接)

Docker系列之八:在Dockerfile中使用多段构建Muti-stage build

Docker系列之九:Docker用于持续集成,构建Jenkins和Docker服务器

Docker系列之十:Docker Compose的使用

简介

构建镜像的一个很有挑战性的事情是保持镜像的小体积。Dockerfile 中的每条指令都会为镜像添加一个层,并且需要你记得在进行到下一层之前清理所有不需要的文件。为了编写高效的 Dockerfile,通常需要使用 shell 技巧和其他逻辑来尽可能地减小层,并确保每个层都从上一层获取且仅仅获取需要的文件。

在Visual Studio中创建一个部署在Linux容器中的DotNetCore应用程序时,它自动创建了一个Dockerfile,内容如下:

FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base
WORKDIR /app
EXPOSE 80

#第一步:使用此SDK进行build
FROM microsoft/dotnet:2.1-sdk AS build
WORKDIR /src
COPY ["Backend1Demo/Backend1Demo.csproj", "Backend1Demo/"]
#加载所需要的nuget依赖包
RUN dotnet restore "Backend1Demo/Backend1Demo.csproj"
#将代码COPY到此镜像的daemon中
COPY . .
WORKDIR "/src/Backend1Demo"
#执行build
RUN dotnet build "Backend1Demo.csproj" -c Release -o /app

#第二步:将build镜像继续作为publish镜像,最终生成的文件放在/app中。
FROM build AS publish
RUN dotnet publish "Backend1Demo.csproj" -c Release -o /app

#第三步:在运行dotnetcore程序的时候,只需要一个runtime镜像就可以了,让镜像的体积足够小
FROM base AS final
WORKDIR /app
#由于每个镜像的文件系统都是互相独立的,build镜像和publish镜像是同一个镜像,所以不用加--from,但publish镜像和runtime镜像是不同的镜像,所以需要从publish镜像将部署文件COPY过来
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "Backend1Demo.dll"]

写到这里,如果你不会dotnetcore,看不懂的话,这里还有另一Dockerfile文件。

这是一个基于angular前端代码所使用的Dockerfile文件,首先它基于node镜像进行build,将build过后的文件放到nginx中运行,如下:

FROM node AS stage
WORKDIR /app
COPY . .
RUN npm install
RUN npm run build:prod

FROM nginx
WORKDIR /usr/share/nginx/html
COPY --from=stage /app/dist/frontendDemo .
EXPOSE 80

猜你喜欢

转载自blog.csdn.net/wucong60/article/details/83994617