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

10

我想知道在构建容器时是否保留__pycache__文件夹和.pyc文件是好还是坏的做法。

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

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

有人进行了性能测试并得出结论吗?

1个回答

13
个人而言,如果可能的话,我不会在容器中使用 __pycache__/.pyc 文件。更具体地说,我尝试构建和运行我的容器,使其在构建或运行时从不生成 .pyc 文件(通过将环境变量 PYTHONDONTWRITEBYTECODE=1 设置并通过 --no-compile --no-cache-dir 显式传递给所有 pip 调用,或通过 pip.conf 或等效环境变量),。
缓存字节码的优点在于启动时间,而不是执行速度;import 所需的时间更长,但实际执行速度与之前一样快(字节码仍在内存中,只是不在磁盘上)。但是,在容器的情况下,使容器变得更大意味着缓存和启动所需的时间更长,因此您浪费了磁盘空间,而任何 Python 启动时间的提高通常都会被第一次拉取和启动容器的延迟所抵消。在运行时编写字节码是没有意义的;当容器关闭时,它将丢失,因此它增加了启动开销,却没有任何好处。
拥有 Python 的基本安装的 .pyc 文件并不是那么糟糕的(尽管正如评论中所述,官方的 Dockerfile 会将它们删除);由于许多容器依赖于它们,基本 Python 映像已被缓存的可能性很高,并且许多预构建的 Python 映像已经拥有了它们(因此在事后删除它们也没有帮助),并且对于构建在其上的容器运行的程序,它确实稍微减少了启动时间。但是,对于每个容器的第三方安装,您只会得到无补偿的膨胀。

5
官方的Python Dockerfiles删除了pyc文件,具体信息请参考此链接:https://github.com/docker-library/python/blob/ae68254c4e7b25cb9dc131b1bafafb00717cd904/3.9/buster/Dockerfile#L54 - Brad Solomon
1
@BradSolomon:说得好。我有时会基于一些非官方的 Python Dockerfile 来创建容器,这种情况下如果它们没有做到这点,当你依赖于它们时想要修复就为时已晚了,但是,确实,尽可能避免这样做是最好的。 - ShadowRanger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接