在編寫Dockerfile構建docker鏡像時,常遇到如下問題:java
爲了解決上述問題,從17.05版本開始Docker在構建鏡像時增長了新特性:多階段構建(multi-stage builds),將構建過程分爲多個階段,每一個階段均可以指定一個基礎鏡像,這樣在一個Dockerfile就能將多個鏡像的特性同時用到,例如:先用SDK鏡像構建.NET Core工程,再把構建結果和Runtime 合成,就作成了一個能夠直接運行.NET Core工程鏡像了;git
官方描述以下圖所示,地址是:https://docs.docker.com/develop/develop-images/multistage-build/github
官方的實例是golang的,今天咱們以.NET Core構建ASP.NET Core工程爲例,介紹如何使用multi-stage特性構建.NET Core微服務鏡像;golang
### 第一階段,用sdk 鏡像進行編譯
FROM microsoft/dotnet:2.1.300-sdk AS build-envdocker
WORKDIR /TechTalksWebasp.net
COPY NuGet.config ./maven
COPY TechTalksWeb.csproj ./微服務
RUN dotnet restore工具
COPY . ./ui
#編譯構建
RUN dotnet publish --configuration Release --output releaseOutput --no-restore
#build runtime image
### 第二階段,用第一階段的.NET Core編譯文件和aspnetcore-runtime 鏡像合成一個小體積的鏡像
FROM microsoft/dotnet:2.1.0-aspnetcore-runtime
WORKDIR /TechTalksWeb
#從名爲build-env的stage複製構建結果到工做目錄
COPY --from=build-env /TechTalksWeb/releaseOutput ./
ENTRYPOINT ["dotnet", "TechTalksWeb.dll"]
上面就是分紅了兩個階段構建的Dockerfile腳本,請參考每行的註釋來理解,有如下幾點須要重點關注: