我正在尝试让我的symfony2应用程序在弹性beanstalk上运行。我正在尝试在我的parameters.yml中获取环境变量(RDS_USER,RDS_PASSWORD等...)以获取数据库凭据。
问题是symfony2需要使用SYMFONY__
作为前缀的环境变量,所以我可以获得没有前缀的这些变量吗?
答案 0 :(得分:28)
您可以将php文件作为资源加载:
# app/config/config.yml
imports:
- { resource: parameters.php }
从那里很容易:
// app/config/parameters.php
$container->setParameter('rds.user', getenv('RDS_USER'));
// if set via apache SetEnv use:
//$container->setParameter('rds.user', apache_getenv('RDS_USER'));
<强>更新强>:
自原始答案以来,使用env-map
中incenteev-parameters
组件的composer.json
功能提供了一个新的解决方案(感谢@darragh-enright指出)。
"extra": {
"incenteev-parameters": {
"file": "app/config/parameters.yml",
"env-map": {
"database_host": "RDS_HOSTNAME",
"database_port": "RDS_PORT",
"database_name": "RDS_DB_NAME",
"database_user": "RDS_USERNAME",
"database_pass": "RDS_PASSWORD"
}
}
}
任何映射参数都将被环境变量中的值覆盖。有关env-map
的更多信息,请参阅documentation。
答案 1 :(得分:13)
我很抱歉,因为这个问题已经得到了解答(我发现答案非常有用,谢谢 @ tomas.pecserke 和 @dubrox !),但我挖了再多一点,我发现了一个替代解决方案,我认为值得为后人添加。
简而言之,您可以在env-map
中向incenteev-parameters
添加composer.json
,以将可用的环境变量映射到参数; e.g:
"extra": {
"incenteev-parameters": {
"file": "app/config/parameters.yml",
"env-map": {
"database_host": "RDS_HOSTNAME",
"database_port": "RDS_PORT",
"database_name": "RDS_DB_NAME",
"database_user": "RDS_USERNAME",
"database_pass": "RDS_PASSWORD"
}
}
}
如Using environment variables to set the parameters中所述:
对于您的prod环境,部署时可能无法使用交互式提示。在这种情况下,您可以依赖环境变量来提供参数。这是通过在环境变量和它们应该填充的参数[...]
之间提供一个映射来实现的
和
如果设置了环境变量,则其值将始终替换现有参数文件中设置的值。
我刚刚在一个新的EB部署上对此进行了测试,并且它是一种享受。您可以使用本地部署对此进行测试,如下所示:
rm app/config/parameters.yml
export RDS_HOSTNAME=foo \
RDS_PORT=3306 \
RDS_DB_NAME=bar \
RDS_USERNAME=baz \
RDS_PASSWORD=quux
composer install
交互式提示将跳过所有database_*
个参数,它们将自动填充环境值。部署理智。太棒了:))
答案 2 :(得分:9)
只是给出一个适合我的明确示例,我在配置文件(parameters.yml
)中同时使用parameters.php
和config.yml
:
# app/config/config.yml
imports:
- { resource: parameters.yml }
- { resource: parameters.php }
如果找到至少一个RDS环境变量,请保留parameters.yml
我的默认值并覆盖parameters.php
中的部分内容:
<?php
// app/config/parameters.php
if(getenv('RDS_HOSTNAME'))) {
$container->setParameter('database_host', getenv('RDS_HOSTNAME'));
$container->setParameter('database_port', getenv('RDS_PORT'));
$container->setParameter('database_name', getenv('RDS_DB_NAME'));
$container->setParameter('database_user', getenv('RDS_USERNAME'));
$container->setParameter('database_password', getenv('RDS_PASSWORD'));
}
希望它有所帮助。
答案 3 :(得分:1)
<?php
// app/config/parameters.php
function setParameter($container, $paramName, array $options, $default = null) {
foreach ($options as $o) {
if (is_string(getenv($o))) {
$container->setParameter($paramName, getenv($o));
return;
}
}
if (! is_null($default)) {
$container->setParameter($paramName, $default);
}
}
setParameter($container, 'database.name', ['RDS_DB_NAME', 'SYMFONY__DATABASE__NAME'], 'DEFAULT');
setParameter($container, 'database.port', ['RDS_PORT', 'SYMFONY__DATABASE__PORT'], '3306');
setParameter($container, 'database.host', ['RDS_HOSTNAME', 'SYMFONY__DATABASE__HOST'], '127.0.0.1');
setParameter($container, 'database.user', ['RDS_USERNAME', 'SYMFONY__DATABASE__USER'], 'root');
setParameter($container, 'database.password', ['RDS_PASSWORD', 'SYMFONY__DATABASE__password'], '');