我一直在努力在Symfony 2.4应用程序中获取必要的env变量。我们的想法是将应用程序放在将由Amazon ECS管理的docker容器中。
我尝试了以下内容:
1 - 使用以下内容导出变量:
export SYMFONY__DATABASE__HOST=blabla
然后在parameters.yml.dist中,得到它:
database_host : '%database.host%'
没有工作。在composer安装之后,创建en parameter.yml,看起来像parameters.yml.dist。这些值尚未转换为env变量中的任何值。
我在某个地方看到我需要禁用该版本。也没帮助。
2 - 使用salaryteev" env_map"
在composer.json中添加变量"env-map": {
"database_host": "DB_HOSTNAME"
}
DB_HOSTNAME是我以相同方式导出的env变量
export DB_HOSTNAME=balbla.com
当我输入php -i | grep DB
时,我确实看到了这些变量。
然后当我输入composer install --no-interaction
时,在第一种情况下,我收到此错误消息:You have requested a non-existent parameter "database.host".
在第二种情况下,参数.yml是使用parameters.yml.dist中的任何值创建的,并且我添加到composer.json的env变量不会在任何地方使用。
https://github.com/symfony/symfony/issues/7555 和 http://symfony.com/doc/current/configuration/external_parameters.html 没多大帮助。
任何想法家伙?我真的希望以最干净的方式获得这些env变量。
答案 0 :(得分:3)
我遇到过同样的麻烦。我找到了一种方法来解决它像Platform.sh那样托管他们的Symfony应用程序。它可以在Github上找到:
https://github.com/platformsh/platformsh-example-symfony
基本上,你创建一个你在config.yml中导入的parameters_prod.php配置文件。在内部,您将测试SYMOFNY_ENV = prod(无论如何在生产中部署时需要设置)。如果设置了这个变量,你会得到parameters_prod.php中的内容,否则你会得到parameters.yml中的内容(对于开发环境)。
为了在parameters_prod.php中获取环境变量,可以使用getenv()PHP方法。
所以基本上,你的parameters_prod.php看起来像这样:
<?php
if (getenv('SYMFONY_ENV') == 'prod') {
$container->setParameter('database_driver', 'pdo_mysql');
$container->setParameter('database_port', 3306);
$container->setParameter('database_host', getenv('DATABASE_HOST'));
$container->setParameter('database_name', getenv('DATABASE_NAME'));
$container->setParameter('database_user', getenv('DATABASE_USER'));
$container->setParameter('database_password', getenv('DATABASE_PASSWORD'));
}
如果你以前台模式启动Apache作为容器的入口点(无论如何你应该这样,否则容器将不会活着),Docker将能够获得这些环境变量,而无需做任何事情。