生产容器中是否应该包含 __pycache__ 文件夹?

sor*_*rin 10 python containers pyc

我想知道将__pycache__文件夹和.pyc文件保存在内置容器中是好还是坏做法。

一方面,您希望最小化容器的大小,但另一方面,您也不希望减慢容器的执行速度。

考虑到 python 解释器是静态的,这些文件也可以被认为是静态的。

有人做过一些性能测试并得出结论吗?

Sha*_*ger 13

就我个人而言,如果可能的话,我不会在容器中使用__pycache__/文件。.pyc更具体地说,我尝试构建和运行我的容器,以便它们在构建期间或运行时永远不会生成.pyc文件(显式地或通过或等效的环境变量设置环境变量PYTHONDONTWRITEBYTECODE=1并传递--no-compile --no-cache-dir给所有调用)。pippip.conf

缓存字节码的优势在于启动时间,而不是执行速度;import需要更长的时间,但实际执行速度同样快(字节码仍然在内存中,只是不在磁盘上)。但就容器而言,使容器变得更大意味着缓存和启动需要更长的时间,因此您浪费了磁盘空间,并且 Python 启动时间的任何收益通常都会被首先拉取和启动容器的延迟所抵消。在运行时写出字节码是没有意义的;当容器关闭时它会丢失,因此它会增加启动费用而没有任何好处。

拥有.pycPython本身的基本安装文件并不是那么糟糕(尽管正如评论中所指出的,官方Dockerfile删除了它们);由于许多容器依赖于它们,基础 Python 镜像已经被缓存的可能性很高,并且许多预构建的 Python 镜像已经拥有它们(因此事后删除它们没有帮助),并且它确实减少了启动时间一些用于在基于它们构建的容器中运行的程序。但对于每个容器的第三方安装来说,你只会变得臃肿而没有任何补偿性好处。

  • [官方Python Dockerfiles](https://github.com/docker-library/python/blob/ae68254c4e7b25cb9dc131b1bafafb00717cd904/3.9/buster/Dockerfile#L54)也删除了pyc (5认同)