防止Python和FFmpeg Heroku构建包覆盖LD_LIBRARY_PATH

2 投票
1 回答
532 浏览
提问于 2025-04-17 20:31

我正在将一个Django应用部署到Heroku上,这个应用需要用到ffmpeg。为此,我使用了heroku-buildpack-multi来安装heroku-buildpack-ffmpegheroku-buildpack-python,这一切都运行得很好。问题是我的应用还依赖于django-pylibmc-saslpython-memcachedpylibmc等,Heroku通常会自动检测并为我安装libmemcached

问题出现在这里。如果我去掉自定义的构建包,一切运行正常(当然ffmpeg除外)。但一旦我添加了它,虽然我可以运行ffmpeg,但是在使用import pylibmc(或者说在模块内部使用import _pylibmc)时,Python就会出错。经过一番思考,我决定查看一下环境变量,结果如下:

仅启用Python构建包时:

LD_LIBRARY_PATH=/app/.heroku/vendor/lib

同时启用Python和ffmpeg构建包时:

LD_LIBRARY_PATH=:vendor/ffmpeg/lib

看起来一个或两个构建包可能会互相覆盖,或者在变量已经设置的情况下不去设置。ffmpeg构建包似乎以我认为合理的方式设置了LD_LIBRARY_PATH,而Python构建包则做了一些我不太理解的事情

解决方案

总之,在手动覆盖库路径后,使用heroku config:set LD_LIBRARY_PATH=/app/.heroku/vendor/lib:vendor/ffmpeg/lib,我能够同时使用libmemcachedffmpeg,但这感觉不太可靠。如果其中一个构建包的路径设置发生变化,或者我添加了另一个构建包,那我就得手动编辑库路径变量了。

更好的解决方案?

所以,虽然这并不是一个紧急的问题,我只是想知道:

  • 有没有更好的方法来解决这个问题?
  • 我是否在配置上犯了错误,导致了路径冲突?
  • 这是否应该被视为其中一个构建包的bug?

1 个回答

1

从代码的表面来看,这可能是heroku-buildpack-python的问题。你可以查看一下你的~/.profile文件(可以通过heroku run bash命令进入),看看LD_LIBRARY_PATH是在哪里设置的。我猜你会先看到ffmpeg的设置,然后再看到Python的设置覆盖了它。

如果真是这样的话,你应该去报告一个bug。

撰写回答