使用 buildpack 部署时,我如何 运行 在 Deis 上自动迁移 Django?

How do I run Django migrations automatically on Deis when using a buildpack deployments?

Deis 上的 post-compile 挂钩似乎与 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 上的 Django 使用 buildpacks 并且有这样的工作示例吗?

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

简单的答案就是提供 python 的完整路径。我通过将 bin/post-compile 文件添加到 deis/example-python-django

进行了测试
#!/usr/bin/env bash

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

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

不幸的是,deis 没有运行 post-compile hooks 的方式与 Heroku 完全相同,所以我们需要先导出我们的环境变量。使用 sub-env function from the heroku-buildpack-python 作为指南,我想出了这个...

#!/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