Docker系列之八:在Dockerfile中使用多段構建Muti-stage build
阿新 • • 發佈:2018-12-27
系列連結
Docker系列之一:Docker介紹及在Ubuntu上安裝
Docker系列之五:Volume 卷的使用——以Redis為例
Docker系列之六:Volume 卷的使用——在Dockerfile中的用法
Docker系列之七:Docker 網路(內部網路、容器之間的連線)
Docker系列之八:在Dockerfile中使用多段構建Muti-stage build
Docker系列之九:Docker用於持續整合,構建Jenkins和Docker伺服器
簡介
構建映象的一個很有挑戰性的事情是保持映象的小體積。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