linux 在Docker映像中安装依赖项后删除pip缓存

qacovj5a  于 2022-12-03  发布在  Linux
关注(0)|答案(1)|浏览(250)

我注意到docker映像可能会很大,因为pip缓存在/root/.cache/pip中。我知道我可以在我的所有依赖项都安装到我的docker映像中后删除这个目录。我不确定的是这与docker的BuildKit有什么关系,它通过使用缓存允许更快的安装。这两个有什么关系吗?所以如果我想从BuildKit中受益,删除/root/.cache/pip安全吗?我的问题是由大量的Python依赖,如 Torch 和nvidia,可能占用几个GB。删除pip缓存可能会减少2-3 GB的图像大小。

anauzrmj

anauzrmj1#

这里更好的解决方案是首先不要缓存包(反正您也不需要它们;映像构建过程不会从中受益,除非您正在做一些糟糕事情)。
最简单的解决方案是只将--no-cache-dir传递给pip调用,它不会首先将包缓存到磁盘。

[global]
no-cache-dir = True

到容器中的/etc/pip.conf以全局禁用它(不需要每次都通过开关)。注意,如果你的映像附带的pip版本早于19.0.1,那么pip.conf解决方案是有缺陷的;如果是这种情况,您可以手动使用--no-cache-dir命令行开关将pip更新到19.0.1之后的版本,然后修改/etc/pip.conf以添加额外的行(如果需要)。
额外的好处:您可能希望扩展pip.conf以:

[install]
compile = no

[global]
no-cache-dir = True

其中compile = no告诉pip不要在安装时将Python源文件编译为字节码;预编译字节码的好处是启动速度(稍微)快一些,但是由于映像过于膨胀,下载/运行它将花费更长的时间,因此Docker层的成本超过了Python启动本身所节省的成本。
最后,添加:

ENV PYTHONDONTWRITEBYTECODE=1

Dockerfile(可以和其他ENV设置结合使用以避免额外的层)。pip.conf防止在安装时编译/写入字节码,环境变量防止在运行时写入字节码(这将是一个毫无意义的练习;当容器退出时,字节码无论如何都将丢失)。

相关问题