gpt4 book ai didi

visual-studio - 在单独的层中复制多个项目文件还是在创建Docker镜像时一次性复制多个项目文件更好?

转载 作者:行者123 更新时间:2023-12-02 19:03:01 25 4
gpt4 key购买 nike

我正在从此.NET Core应用程序中创建一个Docker容器,该容器在解决方案内部具有多个项目,我想知道单独或在一行中对每个项目文件进行COPY更好吗?

Visual Studio生成一个Dockerfile,将每个项目文件复制到新行中,如下所示:

WORKDIR /src
COPY Dir1/Dir1.csproj Dir1/
COPY Dir2/Dir2.csproj Dir2/
COPY Dir3/Dir4/Dir4.csproj Dir3/Dir4/
RUN dotnet restore Dir1/Dir1.csproj

但是,用于使用Docker创建.NET应用程序的Microsoft documentation显示为“优化”,使其仅使用单个 COPY语句,如下所示:
WORKDIR /src
COPY . .
RUN dotnet restore Dir1/Dir1.csproj

在我对本文的理解中,据说可以创建更大的图像,但是如果一个项目发生更改,则不必对所有其他项目进行 COPY

有趣的是, Docker documentation提到

COPY them individually, rather than all at once. This ensures that each step’s build cache is only invalidated (forcing the step to be re-run) if the specifically required files change.



基本上与Microsoft文章所说的有关,当一个项目更改时必须重新运行 COPY步骤。

我想知道哪种选择更好,为什么,或者出于什么目的。或者,也许我误解了一些文档,然后请向我解释其中的区别。

最佳答案

IMO的最佳实践方法是将每个项目复制为一个单独的层,即专用的COPY语句。

使用分开的层。

  • 建立速度更快:
    docker正在缓存图层,因此,如果您在一个项目中进行了更改-
    下次构建镜像时,docker将仅构建更改的层
    并为其他使用缓存。
  • 部署速度更快:层可以并行拉动
  • 高效托管:借助docker copy on write机制,可以在图像之间共享层以节省空间和IO:

  • Copy-on-write is a strategy of sharing and copying files for maximum efficiency. If a file or directory exists in a lower layer within the image, and another layer (including the writable layer) needs read access to it, it just uses the existing file. The first time another layer needs to modify the file (when building the image or running the container), the file is copied into that layer and modified. This minimizes I/O and the size of each of the subsequent layers



    之所以在Dockerfiles中看到常见的 COPY . .语句,是因为通常dockerfile包含一个项目,这也是我也要针对您的情况推荐的最佳实践-在每个项目中放置一个dockerfile并构建单独的镜像(常见的基本图片)。

    如果您应该将所有项目托管在一个镜像中,请至少将它们复制为不同的层。

    关于visual-studio - 在单独的层中复制多个项目文件还是在创建Docker镜像时一次性复制多个项目文件更好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57148332/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com