我注意到docker映像可能会很大,因为pip缓存在/root/.cache/pip中。我知道我可以在我的所有依赖项都安装到我的docker映像中后删除这个目录。我不确定的是这与docker的BuildKit有什么关系,它通过使用缓存允许更快的安装。这两个有什么关系吗?所以如果我想从BuildKit中受益,删除/root/.cache/pip安全吗?我的问题是由大量的Python依赖,如 Torch 和nvidia,可能占用几个GB。删除pip缓存可能会减少2-3 GB的图像大小。
/root/.cache/pip
anauzrmj1#
这里更好的解决方案是首先不要缓存包(反正您也不需要它们;映像构建过程不会从中受益,除非您正在做一些糟糕事情)。最简单的解决方案是只将--no-cache-dir传递给pip调用,它不会首先将包缓存到磁盘。
--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以:
/etc/pip.conf
pip.conf
[install] compile = no [global] no-cache-dir = True
其中compile = no告诉pip不要在安装时将Python源文件编译为字节码;预编译字节码的好处是启动速度(稍微)快一些,但是由于映像过于膨胀,下载/运行它将花费更长的时间,因此Docker层的成本超过了Python启动本身所节省的成本。最后,添加:
compile = no
ENV PYTHONDONTWRITEBYTECODE=1
Dockerfile(可以和其他ENV设置结合使用以避免额外的层)。pip.conf防止在安装时编译/写入字节码,环境变量防止在运行时写入字节码(这将是一个毫无意义的练习;当容器退出时,字节码无论如何都将丢失)。
Dockerfile
ENV
1条答案
按热度按时间anauzrmj1#
这里更好的解决方案是首先不要缓存包(反正您也不需要它们;映像构建过程不会从中受益,除非您正在做一些糟糕事情)。
最简单的解决方案是只将
--no-cache-dir
传递给pip
调用,它不会首先将包缓存到磁盘。到容器中的
/etc/pip.conf
以全局禁用它(不需要每次都通过开关)。注意,如果你的映像附带的pip
版本早于19.0.1,那么pip.conf
解决方案是有缺陷的;如果是这种情况,您可以手动使用--no-cache-dir
命令行开关将pip
更新到19.0.1之后的版本,然后修改/etc/pip.conf
以添加额外的行(如果需要)。额外的好处:您可能希望扩展
pip.conf
以:其中
compile = no
告诉pip
不要在安装时将Python源文件编译为字节码;预编译字节码的好处是启动速度(稍微)快一些,但是由于映像过于膨胀,下载/运行它将花费更长的时间,因此Docker层的成本超过了Python启动本身所节省的成本。最后,添加:
Dockerfile
(可以和其他ENV
设置结合使用以避免额外的层)。pip.conf
防止在安装时编译/写入字节码,环境变量防止在运行时写入字节码(这将是一个毫无意义的练习;当容器退出时,字节码无论如何都将丢失)。