复制。。Dockerfile中用于ASP.NET的命令

Rob*_*ell 6 asp.net docker dockerfile

用于Docker的Visual Studio工具为ASP.NET项目创建一个包含以下COPY . .命令的Dockerfile :

WORKDIR /src
COPY *.sln ./
...
COPY . .
Run Code Online (Sandbox Code Playgroud)

根据我的阅读,<src>参数是相对于上下文的,因此不受WORKDIR /src命令的影响。该<dest>然而,相对于WORKDIR如此将在被人指指点点/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"]
Run Code Online (Sandbox Code Playgroud)

Mat*_*att 7

COPY . .整个项目以递归方式复制到用于构建的容器中。

将前两个COPY命令与分隔开,dotnet restore然后将其COPY与分隔开的原因dotnet build是为了加快构建速度的Docker缓存技巧。这样可以完成,因此不需要在每次更改代码时都安装项目依赖项。

Docker映像是分层构建的。Docker将构成每个新层的内容和说明与以前的版本进行比较。如果它们与现有层的SHA256校验和匹配,则可以跳过该层的构建步骤。

代码比依赖项变化得多,并且依赖项现在通常是从一个缓慢的(ish)网络中获取的。如果在依赖项完成后复制代码,则不会破坏所有其他更改的缓存依赖项层。

相当于Node.js package.json的应用执行内容之前的操作:

WORKDIR /app
COPY package.json /app/
RUN npm install
COPY . /app/
CMD ["node", "app/index.js"]
Run Code Online (Sandbox Code Playgroud)

  • 如果从 Visual Studio 生成的 docker 文件有评论,肯定会有所帮助!一开始这非常令人困惑,所有的教程都只是把它扔掉,希望你能理解这一切。事实证明`COPY . .` 跳过文件已经有什么是重要的。 (2认同)

Rob*_*ell 5

Scott Hanselman 对上述内容的更多指示:https ://www.hanselman.com/blog/OptimizingASPNETCoreDockerImageSizes.aspx

专业提示:Docker 在制作中间镜像和做最少的工作方面很聪明,但如果我们(作者)也做正确的事情来帮助它,它就会很有用。

例如,看看我们在哪里复制 .csproj 然后执行“dotnet 恢复”?通常你会看到人们做“COPY . .” 然后进行恢复。这不允许 Docker 检测到更改的内容,并且您最终需要为每次构建的恢复付费。

通过执行这两个步骤 - 复制项目、恢复、复制代码,这意味着您的“dotnet 恢复”中间步骤将由 Docker 缓存,并且速度会快得多。