Asp.net
複製 。.用於 ASP.NET 的 Dockerfile 中的命令
Docker 的 Visual Studio 工具為 ASP.NET 項目創建一個 Dockerfile,其中包含
COPY . .如下命令:WORKDIR /src COPY *.sln ./ ... COPY . .從我讀過的內容來看,
<src>參數是相對於上下文的,因此不受WORKDIR /src命令的影響。然而<dest>,相對於WORKDIRso 將指向/src。該命令是否只是從根目錄中提取剩余文件進行打包(docker-compose.yml、.dockerignore 等)?如果是這樣,那為什麼要在
RUN dotnet build...命令之前完成呢?完整的 Dockerfile 如下:
FROM microsoft/aspnetcore:2.0 AS base WORKDIR /app EXPOSE 80 FROM microsoft/aspnetcore-build:2.0 AS build WORKDIR /src COPY *.sln ./ COPY MyProject/MyProject.csproj MyProject/ RUN dotnet restore COPY . . # The line mentioned above WORKDIR /src/MyProject RUN dotnet build -c Release -o /app FROM build AS publish RUN dotnet publish -c Release -o /app FROM base AS final WORKDIR /app COPY --from=publish /app . ENTRYPOINT ["dotnet", "MyProject.dll"]
將
COPY . .整個項目以遞歸方式複製到建構容器中。
COPY將前 2 個命令與dotnet restore然後完整COPY的分開的原因dotnet build是 Docker 記憶體技巧以加快容器映像的建構。這樣做是為了不需要在每次更改程式碼時都安裝項目依賴項。Docker 鏡像建構在層中。Docker 將構成每個新層的內容和指令與以前的建構進行比較。如果它們與現有層的 SHA256 校驗和匹配,則可以跳過該層的建構步驟。
程式碼變化比依賴項要多得多,現在依賴項通常是從慢速(ish)網路中獲取的。如果您在依賴項安裝完成後複製程式碼,那麼您不會因其他所有更改而破壞記憶體的依賴項層。
這是具有依賴管理器的許多語言的共同主題。Go、Python、Node.js 等。Node.js 等價物在其餘應用程序內容之前執行
package.jsonand :package-lock.jsonWORKDIR /app COPY package.json package-lock.json /app/ RUN npm install COPY . /app/ CMD ["node", "app/index.js"]