繁体   English   中英

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

[英]Removing pip cache after installing dependencies in Docker image

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

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

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

[global]
no-cache-dir = True

到容器中的/etc/pip.conf以全局禁用它(无需每次都通过开关)。 请注意,如果您的图像附带pip之前的 pip 版本,则pip.conf解决方案存在错误; 如果是这种情况,您可以手动使用--no-cache-dir命令行开关将 pip 更新到pip后版本,然后修改/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阻止在安装时编译/写入字节码,环境变量阻止在运行时写入它们(这将是毫无意义的练习;当容器退出时,字节码无论如何都会丢失)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM