我应该将 Python 的 pyc 文件添加到 .dockerignore 吗?

Should I add Python's pyc files to .dockerignore?

我见过几个 Python 项目的 .dockerignore 文件示例,其中 *.pyc 文件 and/or __pycache__ 文件夹被忽略:

**/__pycache__
*.pyc

由于这些 files/folders 无论如何都将在容器中重新创建,我想知道这样做是否是一个好习惯。

是的,这是推荐的做法。有几个原因:

减小生成图像的大小

.dockerignore 中,您指定不会转到结果图像的文件,这在您构建最小图像时可能至关重要。粗略地说,字节码文件的大小等于实际文件的大小。字节码文件不用于分发,这就是为什么我们通常也将它们放入 .gitignore

与缓存相关的问题

在 Python 3.x 的早期版本中有几个缓存相关 issues:

Python’s scheme for caching bytecode in .pyc files did not work well in environments with multiple Python interpreters. If one interpreter encountered a cached file created by another interpreter, it would recompile the source and overwrite the cached file, thus losing the benefits of caching.

自 Python 3.2 以来,所有缓存的文件都以 mymodule.cpython-32.pyc 解释器版本为前缀,并显示在 __pychache__ 目录下。顺便说一句,从 Python 3.8 开始,您甚至可以 control 一个用于存储缓存的目录。当您限制对目录的写访问但仍希望获得缓存使用的好处时,它可能很有用。

通常情况下,缓存系统运行良好,但总有一天会出现问题。值得注意的是,如果 .py 文件丢失,将使用缓存的 .pyc(位于同一目录中)文件而不是 .py 文件。实际上,这并不常见,但如果某些东西一直 "there",考虑删除缓存文件是个好主意。当您在 Python 中试验缓存系统或在不同环境中执行脚本时,这可能很重要。

安全原因

很可能您甚至不需要考虑它,但缓存文件可能包含某种敏感信息。由于当前的实现,在 .pyc 文件中提供了实际文件的绝对路径。有些情况下您不想共享此类信息。


似乎与字节码文件交互是相当频繁的必要,例如django-extensions have appropriate options compile_pyc and clean_pyc