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

Jak*_*cki 0 python linux pip docker

我注意到 docker 镜像可能会很大,因为将 pip 缓存保存在/root/.cache/pip. 我知道在我的 docker 映像中安装了所有依赖项后,我可以删除此目录。我不确定这与 docker 的 BuildKit 有什么关系,它允许使用缓存更快地安装。这两者有某种关联吗?那么,如果我想从 BuildKit 中受益,删除它是否安全/root/.cache/pip?我的问题是由大量的Python依赖项(例如torch和nvidia)引起的,它们可能占用几GB。删除 pip 缓存可能会将图像的大小减少 2-3 GB。

Sha*_*ger 5

这里更好的解决方案是首先不缓存包(无论如何你都不会需要它们;除非你做了一些可怕的事情,否则映像构建过程不会从它们中受益)。

最简单的解决方案是仅传递--no-cache-dir给您的pip调用,并且它不会首先将包缓存到磁盘。或者,您可以删除pip.conf包含:

[global]
no-cache-dir = True
Run Code Online (Sandbox Code Playgroud)

/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
Run Code Online (Sandbox Code Playgroud)

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

最后补充一下:

ENV PYTHONDONTWRITEBYTECODE=1
Run Code Online (Sandbox Code Playgroud)

到文件顶部附近Dockerfile(可以与其他设置结合使用以避免额外的图层)。ENV如果pip.conf阻止在安装时编译/写入字节码,则环境变量会阻止在运行时写入它们(这将是毫无意义的练习;当容器退出时,字节码无论如何都会丢失)。