Reputation: 23
I've been struggling to get the necessary env variables in a Symfony 2.4 application. The idea is to put the application in a docker container that will be managed by Amazon ECS.
I have tried the following :
1 - export a variable with :
export SYMFONY__DATABASE__HOST=blabla
then in parameters.yml.dist, get it with :
database_host : '%database.host%'
Didn't work. After composer install, en parameter.yml is created with that look like parameters.yml.dist. The values have not been translated to whatever is in the env variables.
I saw somewhere that I need to disable the incenteev bundle. Didn't help either.
2 - Add the variables in composer.json using incenteev's "env_map"
"env-map": {
"database_host": "DB_HOSTNAME"
}
DB_HOSTNAME being an env variable that I export in the same way
export DB_HOSTNAME=balbla.com
When I type php -i | grep DB
, I do see those variables.
Then when I type composer install --no-interaction
, in the first case I get this error message : You have requested a non-existent parameter "database.host".
In the second case, parameters.yml is created with whatever values are in parameters.yml.dist, and the env variable I added to composer.json is not used any where.
https://github.com/symfony/symfony/issues/7555 and http://symfony.com/doc/current/configuration/external_parameters.html did not help much.
Any Ideas guys? I really would like to get those env variables in the cleanest way possible.
Upvotes: 2
Views: 2782
Reputation: 2774
I have run into the same trouble once. I found a way to get around it like Platform.sh do to host their Symfony applications. It's available on Github :
https://github.com/platformsh/platformsh-example-symfony
So basically, you create a parameters_prod.php config file wich you import in config.yml. Inside, you test to see if SYMOFNY_ENV=prod (which you need to set up when you deploy in production anyway). If this variable is set, you get what's in parameters_prod.php, otherwise you get what's in parameters.yml (for the dev environment).
And to get you environment variables in parameters_prod.php, you use the getenv() PHP method.
So basically, your parameters_prod.php will look something like this :
<?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'));
}
Docker will be able to get these environment variable without any thing else to do if you launch Apache in foreground mode as the entrypoint of your container (which you should anyway, otherwise the containers will not stay alive)
Upvotes: 3