将我的Python应用部署到Heroku时破坏了Heroku的Python解释器
这是一个老旧的应用,已经在Heroku上运行了大约两年。现在突然间,当我进行部署(就是用标准的git push命令)时,Python解释器就坏掉了,无论是在普通的还是临时的dyno上。情况如下:
$ 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
命令、把dyno缩减到零再恢复,这些都没有解决问题。
我能想到的与这个问题相关的唯一变化是:gevent
从0.13.6升级到了1.0.1,还有就是引入了一个runtime.txt
文件(之前没有这个文件,导致使用的是2.7.4,现在有了,变成了2.7.6)。
不过,我把这些都恢复到之前的状态,结果还是没有效果。实际上,我回退了大约30次提交(而这次部署大概只有五次提交),推送后应用依然坏掉。
使用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
当然,我不知道这个文件是否应该在这里。
3 个回答
你在用默认的Python构建包吗?Heroku正在更新它的系统镜像,特别是如果你没有使用最新的构建包,可能会出现不兼容的问题。
要检查你是否在使用默认的构建包,可以运行以下命令:
$ heroku config | grep BUILDPACK_URL
如果你觉得这可能是问题的原因,请联系Heroku的客服支持。
有些应用程序似乎没有正确更新。这里有一个临时的解决办法,可以帮助你找到正确的Python库:
heroku config:set LD_LIBRARY_PATH=/app/.heroku/python/lib
大家好,我是Python团队的Kenneth Reitz。
我们正在对我们系统上安装的Python版本进行安全更新。用户不需要担心,因为他们的应用程序使用的是自己的Python版本,而且我们在一个叫做.profile.d
的脚本中设置了本地运行时特定的环境变量(比如LD_LIBRARY_PATH
),这些设置不会影响用户自己配置的内容。
不过,我们允许一些高级用户通过$ heroku config
来覆盖这些环境变量。实际上,应用程序就是在做这件事——虽然它并不知道。这是一个很久以前的Heroku的意外副作用。在早期,我们无法在不属于用户配置的情况下进行任何运行时特定的配置。这就是为什么你的应用程序会有一个LD_LIBRARY_PATH
的配置,并且这导致了这个错误。
因此,我已经禁用了Python应用程序对LD_LIBRARY_PATH
的覆盖功能,今后应该不会再有问题了。
感谢大家参与这个逐步推出的过程,也感谢你们帮助我们解决这个问题。对于造成的不便,我深表歉意。