【问题标题】:Deploying my Python app to Heroku breaks Heroku's Python interpreter将我的 Python 应用程序部署到 Heroku 会破坏 Heroku 的 Python 解释器
【发布时间】:2014-07-24 11:28:07
【问题描述】:

这是一个旧应用程序,在 Heroku 上运行了大约两年。现在突然间,当我部署(标准 git push)时,它会在常规和一次性 dynos 上破坏 Python 解释器。这是它的样子:

$ heroku run python
Running `python` attached to terminal... up, run.8338
python: error while loading shared libraries: libpython2.7.so.1.0: cannot open shared object file: No such file or directory

进一步推动,heroku restart,将测功机缩放到零并备份,但这一切都无法解决。

我能想象到的与此问题相关的部署中包含的唯一更改是:gevent 从 0.13.6 升级到 1.0.1 并引入了 runtime.txt(之前没有,导致 2.7 .4,现在有一个用于 2.7.6)。

但是,我将所有这些都回滚到没有效果。事实上,我返回了大约 30 次提交(部署可能包含五个)并推送了它,但应用程序仍然损坏。

使用heroku rollback 回滚是我发现将应用程序恢复到可用状态的唯一方法。但这当然无助于我前进。

什么可能导致这种情况?我能以某种方式从头开始重建我的整个应用环境吗?

编辑 1:我在一次性测功机中打开了一个 shell,我可以在那里看到 libpython2.7.so.1.0 文件:

/ $ ls -la /app/.heroku/python/lib/libpython2.7.so.1.0
-r-x------ 1 u49295 49295 5694572 2014-06-03 23:39 /app/.heroku/python/lib/libpython2.7.so.1.0

当然我不知道它是否应该是这样。

【问题讨论】:

    标签: python heroku


    【解决方案1】:

    不知何故,某些应用程序没有正确升级。找到正确的 python 库的临时修复:

    heroku config:set LD_LIBRARY_PATH=/app/.heroku/python/lib
    

    【讨论】:

    • 奇怪的是,我似乎可以立即在heroku config:unset LD_LIBRARY_PATH 之后继续工作。 (我猜这个配置标志实际上只是设置环境变量,然后在您取消设置时不会将其删除。)
    • 在我部署之前(在 release:rollback 之后),LD_LIBRARY_PATH 环境变量设置为/app/.heroku/vendor/lib(即使/app/.heroku/vendor 不存在),但Python 解释器仍然有效。部署后,它设置为相同但不再有效。所以我不太明白这里发生了什么。但无论如何,修复是有效的。
    • 是的,我也不完全理解想要在幕后发生的事情:S。我的一些应用程序有这条不存在的路径,但工作正常,但我的一个应用程序坏了。这可能是一些heroku魔法。
    【解决方案2】:

    来自 Python 团队的 Kenneth Reitz。

    因此,我们正在向我们安装在基础系统上的 Python 版本推出安全更新。客户不应受到任何影响,因为他们的应用程序使用他们自己的 Python 版本,并且因为我们在用户设置配置之外的 .profile.d 脚本中设置了本地运行时特定(例如 LD_LIBRARY_PATH) .

    但是,我们允许高级用户使用 $ heroku config 覆盖这些环境变量。这基本上就是应用程序正在做的事情——虽然,不是有意的。这是一个更老的 Heroku 的意外副作用。在过去,如果不成为用户配置的一部分,我们就无法拥有任何特定于运行时的配置。这就是为什么您的应用程序有一个 LD_LIBRARY_PATH 配置集,这就是导致此错误的原因。

    因此,我为 Python 应用禁用了 LD_LIBRARY_PATH 的可覆盖性,一切都应该顺利进行。

    感谢您参与逐步推出过程,并感谢您帮助我们深入了解此回归。给您带来的不便,我深表歉意。

    【讨论】:

      【解决方案3】:

      您使用的是默认的 Python 构建包吗? Heroku 正在更新 Stack 映像,尤其是如果您没有使用当前的 buildpack,则可能存在不兼容问题。

      要查看您是否使用默认构建包,请运行

      $ heroku config | grep BUILDPACK_URL
      

      如果您认为这可能是原因,请联系 Heroku 支持。

      【讨论】:

      • 好主意,但不,我没有使用自定义 buildpack,我使用的是默认的自动检测 Python buildpack。应该马上提到这个。您从哪里了解到他们更新 Stack 映像的信息?也许这与我的问题有关。
      猜你喜欢
      • 2020-06-24
      • 1970-01-01
      • 2020-07-09
      • 1970-01-01
      • 2020-08-22
      • 1970-01-01
      • 2018-03-29
      • 2020-07-18
      • 2018-04-07
      相关资源
      最近更新 更多