这是一款旧应用程序,在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
,将dynos缩放到零并备份,所有都无法解决。
我认为与此问题相关的此部署中包含的唯一更改是:gevent
从0.13.6升级到1.0.1并引入runtime.txt
(之前没有) ,得到2.7.4,现在有2.7.6)。
使用heroku rollback
回滚是我发现将应用程序恢复到可用状态的唯一方法。但是,这当然不能帮助我继续前进。
可能是什么原因引起的?我能以某种方式从头开始重建我的整个应用程序环境吗?
编辑1:我在一次性dyno中打开了一个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
当然,我不知道这是不是应该在哪里。
答案 0 :(得分:2)
某些应用程序无法正常升级。找到正确的python库的临时修复:
heroku config:set LD_LIBRARY_PATH=/app/.heroku/python/lib
答案 1 :(得分:1)
来自Python团队的Kenneth Reitz。
因此,我们正在对我们在基础系统上安装的Python版本进行安全更新。客户不应以任何方式受此影响,因为他们的应用程序使用自己的Python版本,并且因为我们在LD_LIBRARY_PATH
脚本中设置了本地运行时特定的(例如.profile.d
)用户设置配置。
但是,我们允许高级用户使用$ heroku config
覆盖这些环境变量。这基本上就是应用程序正在做的事情 - 尽管不是故意的。这是一个更老的Heroku的意外副作用。在旧时代,如果不是用户配置的一部分,我们就无法进行任何特定于运行时的配置。这就是为什么你的应用程序有一个LD_LIBRARY_PATH
配置集,这就是造成这个错误的原因。
正因为如此,我已经禁用了LD_LIBRARY_PATH
对Python应用程序的可覆盖性,所有这些都应该很好地向前发展。
感谢您成为逐步推出过程的一部分,并感谢您帮助我们了解此回归的底部。对此给您带来的不便,我感到非常抱歉。
答案 2 :(得分:0)
您使用的是默认的Python buildpack吗? Heroku正在更新Stack映像,特别是如果你没有使用当前的buildpack,可能会有不兼容性。
要查看您是否使用默认的buildpack,请运行
$ heroku config | grep BUILDPACK_URL
如果您认为这可能是原因,请联系Heroku支持。