Asp.net

複製 。.用於 ASP.NET 的 Dockerfile 中的命令

  • December 1, 2021

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.json

WORKDIR /app
COPY package.json package-lock.json /app/
RUN npm install
COPY . /app/
CMD ["node", "app/index.js"]

引用自:https://stackoverflow.com/questions/47270150