Configuration 如何可靠地确定我的项目运行在哪个PaaS上?
我有一个小项目,我想部署到Heroku和OpenShift,在这两个平台上进行试验。我正在使用Python/Django,所以我想利用动态导入功能来定义每个环境的设置,为我想要部署到的平台维护一个设置模块,比如: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
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
?完全是这样的。你可能需要做一点实验,但确实这样看起来不错。