1. 程式人生 > >Docker系列之八:在Dockerfile中使用多段構建Muti-stage build

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