【问题标题】:Should I add Python's pyc files to .dockerignore?我应该将 Python 的 pyc 文件添加到 .dockerignore 吗?
【发布时间】:2020-04-28 06:44:05
【问题描述】:

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

**/__pycache__
*.pyc

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

【问题讨论】:

  • 我想知道为什么不呢?
  • 也许是一个固执己见的问题,但我的回答是肯定的,尤其是在发生变化的情况下。只需让解释器缓存每个客户端上的pycs,以确保运行最新的代码。
  • @Sraw 似乎是不必要的工作。另外,我可以想到某些情况下,进程可能没有足够的权限来创建这些文件。

标签: python docker compilation docker-build


【解决方案1】:

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

缩小生成图像的大小

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

缓存相关问题

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

Python 在 .pyc 文件中缓存字节码的方案效果不佳 在具有多个 Python 解释器的环境中。如果一名口译员 遇到另一个解释器创建的缓存文件,它会 重新编译源并覆盖缓存文件,从而丢失 缓存的好处。

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

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

安全原因

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


似乎与字节码文件交互是一种非常频繁的必要性,例如,django-extensions 有适当的选项 compile_pycclean_pyc

【讨论】:

    猜你喜欢
    • 2021-12-28
    • 1970-01-01
    • 2016-06-07
    • 1970-01-01
    • 1970-01-01
    • 2018-11-24
    • 2020-12-10
    • 2015-07-28
    • 1970-01-01
    相关资源
    最近更新 更多