![]() |
1
7
Dockerfile中的卷在这里适得其反。这将在每个构建步骤以及运行容器时装载匿名卷。每个构建步骤中的卷在该步骤完成后被丢弃,这意味着您需要再次下载所有需要这些依赖项的其他步骤的全部内容。 这方面的标准模型是复制依赖项规范,运行依赖项下载,复制代码,然后编译或运行代码,共分4个步骤。这让docker能够高效地缓存层。我对铁锈或货物不太熟悉,但我相信这看起来像:
另一个选择是使用BuildKit启用一些实验性功能( available in 18.09, released 2018-11-08 )所以docker会将这些依赖项保存在类似于构建的命名卷中。该目录可以跨构建重用,但永远不会添加到映像本身,这使得它对下载缓存之类的东西很有用。
注意,上面假设cargo正在/root/中缓存文件。货物您需要对此进行验证,并根据需要进行调整。我还没有将挂载语法与json exec语法混合使用,以了解该部分是否有效。您可以在此处阅读有关BuildKit实验功能的更多信息: https://github.com/moby/buildkit/blob/master/frontend/dockerfile/docs/experimental.md
从18.09和更新版本中打开BuildKit非常简单
|
![]() |
2
6
我会说,更好的解决办法是求助于docker multi-stage build 正如所指出的 here 和 there 通过这种方式,您可以创建第一个映像,该映像将构建应用程序和依赖项,然后在第二个映像中仅使用第一个映像中的依赖项文件夹 这是受到你对 @Jack Gore's answer 以及上面链接的两个问题评论。
PS:只运行一次将减少生成的层数;更多信息 here |
![]() |
3
3
下面是对各种可能性的概述。(向下滚动查看我的原始答案。)
注:可以设置
另请注意:
Cargo工作区需要手动添加每个Cargo文件,对于某些解决方案,还需要生成十几个假文件
我必须通过添加
哪里
这是外部安装的,不是从Dockerfile安装的。 编辑1 :我不明白为什么会这样,但是@b.enoit。be和@BMitch澄清了这是因为Dockerfile中声明的卷只在一个层(一个命令)中有效。 |
![]() |
4
2
您不需要使用显式Docker卷来缓存依赖项。Docker将自动缓存图像的不同“层”。基本上,Dockerfile中的每个命令都对应于图像的一层。你面临的问题取决于你如何
Docker在图像层缓存中遵循的规则在官方文件中列出 documentation :
所以问题在于命令的定位
要解决您的问题,只需在您的应用程序中重新排序命令即可
通过这种方式,只有当您的应用程序发生更改时,您的依赖项才会重新安装
希望这有帮助。 |
![]() |
5
1
随着BuildKit与docker的集成,如果您能够利用高级BuildKit后端,现在就可以 mount a cache volume during a RUN command 这已经成为缓存货物构建的最佳方式。缓存卷保留以前运行时写入的数据。 要使用BuildKit,您将装载两个缓存卷,一个用于cargo目录,用于缓存外部板条箱源,另一个用于目标目录,用于缓存所有构建的工件,包括外部板条箱、项目箱和库。
如果你的基本形象是
如果你的基本图像是其他东西,你需要改变
实现货物构建缓存的其他选项(包括sccache和
|
![]() |
6
1
我用romac的叉子找到了如何在货物工作区也能使用它的方法 cargo-build-deps .
这个例子有
|
![]() |
7
0
我相信您可以调整此代码以用于Dockerfile,但我
wrote a dockerized drop-in replacement for
用法:
它将使用当前工作目录并将缓存保存到
创建一个名为
|
![]() |
daniel451 · 从源代码编译Python:多线程测试? 7 年前 |
![]() |
mbalug · 为ARM编译c++源代码 7 年前 |
![]() |
SuzLy · 使用flex编译简单令牌标识符 7 年前 |
|
user8659414 · Make无法识别我的库! 7 年前 |
![]() |
Farzad · 序列化CUfunction对象 7 年前 |
![]() |
Jersey · C++:何时需要重新编译有问题? 7 年前 |