caching - 如何在奇点构建中利用主机缓存?
问题描述
我正在寻找优化奇点 HPC 容器构建时间的方法。我知道我可以通过逐层构建它们来节省一些时间。但是,仍然有优化的空间。
我感兴趣的是在主机系统上使用/缓存任何有意义的东西。
- CCache 用于 C++ 构建工件缓存
- git repo 克隆
- APT 软件包下载
我做了一些实验,但没有成功。
到目前为止我发现了什么:
缓存
我在容器中安装 ccache 并指示构建系统使用它。我知道因为我singularity build
使用 sudo 运行,所以缓存会在/root
. 但是运行构建后,/root/.ccache
是空的。我验证了生成的 CMake 构建文件,它们肯定使用 ccache。
我什至创建了一个包含%post
touch "$HOME/.ccache/test"
但是测试文件没有出现在主机系统的任何地方(不在/root
我用户的家中也没有出现)。构建步骤是否将容器支持的目录挂载到/root
而不是主机的根目录?
是否需要做更多的事情来利用 ccache?
吉特
人们建议运行例如 git-cache-http-server ( https://stackoverflow.com/a/43643622/1076564 ) 并使用git config --global url."http://gitcache:1234/".insteadOf https://
.
由于奇异性可以读取主机文件系统的部分内容,我认为甚至有一种方法可以让它在没有代理程序的情况下工作。但是,如果主机 git repos 不在$HOME
or/tmp
中,那么在构建过程中,singularity 如何访问它们?singularity build
没有--bind
标志来指定其他挂载目录。并且使用%files
配方中的部分听起来效率低下 - 每次运行构建时都复制所有内容。
易于
人们建议使用例如 squid-deb-proxy ( https://gist.github.com/dergachev/8441335 )。同样,由于奇异性能够读取主机文件系统文件,我想只使用主机的/var/cache/apt
. 但/var
默认情况下不会挂载到容器中。所以再次出现同样的问题 - 我如何/var/cache/apt
在容器构建期间挂载。总的来说这是个好主意吗?考虑到主机和容器都基于相同版本的 Ubuntu 和架构,它不会损坏主机的 APT 缓存吗?
还是奇点本身做了一些聪明的 APT 缓存?我刚刚注意到它在 25 秒内下载了 420 MB 的包,这在我的连接上是可能的,但考虑到 ubuntu 镜像的标准速度,这不太可能。
编辑:我在奇异回购上创建了一个问题:https ://github.com/hpcng/singularity/issues/5352 。
解决方案
据我所知,从定义文件构建时没有缓存奇点构建的机制。您可以缓存基础映像的下载,仅此而已。
有一个GitHub issue与此相关,其中 Singularity 的主要开发人员之一给出了以下回复:
您可以从磁盘上的现有容器构建 Singularity 容器。因此,您可以构建基础容器并保存它,然后修改 def 文件以从现有容器构建,以节省原型制作时间。
但是由于 Singularity 不创建层,因此实际上没有办法像 Docker 那样实现这一点。
关于您的问题的一点:
我知道我可以通过逐层构建它们来节省一些时间
Singularity 没有层的概念,所以这里不适用。Docker 使用层,并且这些层被缓存。
在构建 Singularity 映像时,我通常遵循的工作流程是首先从 Dockerfile 创建 Docker 映像,然后将其转换为 Singularity 映像。Docker 构建步骤具有缓存,因此这可能对您有用。
# Build Docker image
docker build --tag my_image:latest .
# Convert to Singularity format
sudo singularity build my_image.sif docker-daemon://my_image:latest
推荐阅读
- css - 为什么某些图像在移动版 Firefox 中显示为假颜色?
- c++ - C++为类方法实现超时函数模板
- curl - Kubernetes cronJob 使用带有标头的 CURL 调用 REST API 因 curl(6) 失败:无法解析主机
- csv - 避免在 read_csv 中读取多索引
- angularjs - Angular/JS 在一种方法中获得两个 $event.target.value
- authentication - Nginx白名单IP,否则使用证书
- elasticsearch - Elasticsearch 忽略了我的 JVM 堆大小设置
- java - 我应该遵循什么方法在android中制作定时器服务
- linux - 如何使用 tail -f 跟踪最新的日志文件?
- grails-orm - 使用具有多个数据源的 Micronaut + GORM 时如何配置 applicatiuon.yml