1

Deis 上的编译后挂钩似乎与 Heroku 上的功能不同。

在 Heroku 上,我可以简单地添加一个 bin/post-compile 文件,其中包含:

#!/usr/bin/env bash

python manage.py migrate --noinput

在 Deis 上,这给了我一个回溯

Traceback (most recent call last):        
    File "manage.py", line 8, in <module>        
        from django.core.management import execute_from_command_line        
No module named django.core.management      

有没有人在 Deis 上使用 buildpacks 运行 Django 并有一个工作示例?

4

1 回答 1

1

我最终找到了两种解决方案。

简单的答案是只提供 python 的完整路径。我通过将 bin/post-compile 文件添加到deis/example-python-django对此进行了测试

#!/usr/bin/env bash

/app/.heroku/python/bin/python manage.py migrate --noinput

但是,如果您需要访问任何配置变量,则此解决方案不起作用,如果您遵循 12 Factor 应用程序方法,则很可能出现这种情况。

不幸的是,deis 并没有像 Heroku 那样运行编译后钩子,所以我们需要先导出环境变量。使用heroku-buildpack-python中的sub-env函数作为指南,我想出了这个......

#!/usr/bin/env bash

echo "-----> Running post-compile hook"

BUILD_DIR=/tmp/build
ENV_DIR=/tmp/environment

BLACKLIST='^(GIT_DIR|STACK|PYTHONHOME|LD_LIBRARY_PATH|LIBRARY_PATH|PATH)$'

# Python-specific variables.
export PYTHONHOME=$BUILD_DIR/.heroku/python
export PYTHONPATH=$BUILD_DIR/

if [ -d "$ENV_DIR" ]; then
  for e in $(ls $ENV_DIR); do
    echo "$e" | grep -E "$WHITELIST" | grep -qvE "$BLACKLIST" &&
    export "$e=$(cat $ENV_DIR/$e)"
    :
  done
fi

$PYTHONHOME/bin/python manage.py migrate --noinput
于 2017-07-06T09:39:25.077 回答