Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Configuration 如何可靠地确定我的项目运行在哪个PaaS上?_Configuration_Heroku_Environment Variables_Paas_Openshift - Fatal编程技术网

Configuration 如何可靠地确定我的项目运行在哪个PaaS上?

Configuration 如何可靠地确定我的项目运行在哪个PaaS上?,configuration,heroku,environment-variables,paas,openshift,Configuration,Heroku,Environment Variables,Paas,Openshift,我有一个小项目,我想部署到Heroku和OpenShift,在这两个平台上进行试验。我正在使用Python/Django,所以我想利用动态导入功能来定义每个环境的设置,为我想要部署到的平台维护一个设置模块,比如: my_project/ settings/ __init__.py <-- This is what's being imported during app init, here is where I want to detect which platf

我有一个小项目,我想部署到Heroku和OpenShift,在这两个平台上进行试验。我正在使用Python/Django,所以我想利用动态导入功能来定义每个环境的设置,为我想要部署到的平台维护一个设置模块,比如:

my_project/
    settings/
        __init__.py  <-- This is what's being imported during app init, here is where I want to detect which platform specific settings module to load
        dev_settings.py
        heroku_settings.py
        openshift_settings.py
最好通过默认的(不是由我/开发人员设置的)环境变量来检测。Heroku只透露了一些:

DATABASE_URL
ENVIRONMENT
LANG
LD_LIBRARY_PATH
LIBRARY_PATH
PATH
PYTHONHASHSEED
PYTHONHOME
PYTHONPATH
PYTHONUNBUFFERED
SHARED_DATABASE_URL
以及OpenShift的:

OPENSHIFT_DB_HOST
OPENSHIFT_LOG_DIR
OPENSHIFT_TMP_DIR
OPENSHIFT_DB_CTL_SCRIPT
OPENSHIFT_REPO_DIR
OPENSHIFT_HOMEDIR
OPENSHIFT_GEAR_NAME
OPENSHIFT_PHPMYADMIN_IP
OPENSHIFT_RUNTIME_DIR
OPENSHIFT_INTERNAL_PORT
OPENSHIFT_PHPMYADMIN_CTL_SCRIPT
OPENSHIFT_DB_MYSQL_51_RESTORE
OPENSHIFT_DB_MYSQL_51_DUMP
OPENSHIFT_DB_PASSWORD
OPENSHIFT_DB_USERNAME
OPENSHIFT_PHPMYADMIN_GEAR_DIR
OPENSHIFT_RUN_DIR
OPENSHIFT_INTERNAL_IP
OPENSHIFT_GEAR_DIR
OPENSHIFT_GEAR_CTL_SCRIPT
OPENSHIFT_APP_DNS
OPENSHIFT_GEAR_TYPE
OPENSHIFT_GEAR_DNS
OPENSHIFT_DB_MYSQL_51_EMBEDDED_TYPE
OPENSHIFT_DB_URL
OPENSHIFT_APP_NAME
OPENSHIFT_DATA_DIR
OPENSHIFT_DB_SOCKET
OPENSHIFT_GEAR_UUID
OPENSHIFT_APP_UUID
OPENSHIFT_DB_TYPE
OPENSHIFT_DB_MYSQL_51_DUMP_CLEANUP
OPENSHIFT_DB_PORT
OpenShift变量的前缀是
OpenShift\uu
,因此有一个开始,但Heroku的情况并非如此


如何使用环境变量可靠地检测平台?

我建议设置自己的环境配置设置。使用heroku可以很容易地做到这一点

heroku config:add MY_DEPLOYMENT_PLATFORM=heroku
然后,在初始值设定项中(或任何需要的地方),您可以访问该值,如下所示:

if ENV["MY_DEPLOYMENT_PLATFORM"] == "heroku"
 // perform heroku config
else 
 // perform other PAAS config
end

我建议设置自己的环境配置设置。使用heroku可以很容易地做到这一点

heroku config:add MY_DEPLOYMENT_PLATFORM=heroku
然后,在初始值设定项中(或任何需要的地方),您可以访问该值,如下所示:

if ENV["MY_DEPLOYMENT_PLATFORM"] == "heroku"
 // perform heroku config
else 
 // perform other PAAS config
end

@凯文,我将我的评论作为一个答案发布,这样人们可以很快看到(或改进!):


@凯文,我将我的评论作为一个答案发布,这样人们可以很快看到(或改进!):


这就是我如何检测我的应用程序当前所在的PaaS。overide_设置方法不是我的

def override_settings(dottedpath):
    """Imports uppercase modules from an string based module.
    Example:
        override_settings('my.module.settings')
    """
    try:
        _m = import_module(dottedpath)
    except ImportError:
        warnings.warn("Failed to import %s" % dottedpath) # <-- will show up in your error log
    else:
        _thismodule = sys.modules[__name__]
        for _k in dir(_m): # <-- moved the block inside else
            if _k.isupper() and not _k.startswith('__'): setattr(_thismodule,
                _k, getattr(_m, _k))

ON_OPENSHIFT = False
if os.environ.has_key('OPENSHIFT_REPO_DIR'):
    ON_OPENSHIFT = True

ON_HEROKU = False
if os.environ.get('LD_LIBRARY_PATH', None) == '/app/.heroku/vendor/lib':
    ON_HEROKU = True

if ON_OPENSHIFT:
    override_settings('settings.openshift')

if ON_HEROKU:
    override_settings('settings.heroku')
def覆盖_设置(dottedpath):
“”“从基于字符串的模块导入大写模块。
例子:
覆盖_设置(“my.module.settings”)
"""
尝试:
_m=导入模块(点路径)
除恐怖外:

warnings.warn(“未能导入%s”%dottedpath)#这是我如何检测当前打开的PaaS我的应用程序的。overide_设置方法不是我的

def override_settings(dottedpath):
    """Imports uppercase modules from an string based module.
    Example:
        override_settings('my.module.settings')
    """
    try:
        _m = import_module(dottedpath)
    except ImportError:
        warnings.warn("Failed to import %s" % dottedpath) # <-- will show up in your error log
    else:
        _thismodule = sys.modules[__name__]
        for _k in dir(_m): # <-- moved the block inside else
            if _k.isupper() and not _k.startswith('__'): setattr(_thismodule,
                _k, getattr(_m, _k))

ON_OPENSHIFT = False
if os.environ.has_key('OPENSHIFT_REPO_DIR'):
    ON_OPENSHIFT = True

ON_HEROKU = False
if os.environ.get('LD_LIBRARY_PATH', None) == '/app/.heroku/vendor/lib':
    ON_HEROKU = True

if ON_OPENSHIFT:
    override_settings('settings.openshift')

if ON_HEROKU:
    override_settings('settings.heroku')
def覆盖_设置(dottedpath):
“”“从基于字符串的模块导入大写模块。
例子:
覆盖_设置(“my.module.settings”)
"""
尝试:
_m=导入模块(点路径)
除恐怖外:

warnings.warn(“导入%s”%dottedpath失败)#OpenShift不允许您设置自定义环境变量(目前),这就是我寻找“启发式”方法的原因。您仍然可以检查变量的存在(或缺少)。关于
len([k代表os.environ.keys()中的k,如果k.startswith('OpenShift'))呢>0#测试OpenShift
len([k代表os.environ.values()中的k,如果k.find('heroku')>-1])>0#测试heroku
?完全是这样的。您可能需要进行一些实验,但看起来确实不错。OpenShift不允许您设置自定义环境变量(但),这就是为什么我要寻找一种“启发式”方法。您仍然可以检查变量的存在(或缺少)。关于
len([k代表os.environ.keys()中的k,如果k.startswith('OpenShift')])呢>0#测试OpenShift
len([k代表os.environ.values()中的k,如果k.find('heroku')>-1])>0#测试heroku
?完全是这样的。你可能需要做一点实验,但确实这样看起来不错。