Использование переменных среды для подключения к базе данных RDS mysql из приложения php YII, запущенного в док-контейнере - PullRequest
0 голосов
/ 15 марта 2019

Я использую несколько Docker-контейнеров в aws ecs, Все они работают в приложении php Yii.

приложениям необходимо подключиться к базе данных AWS RDS.в настоящее время имя базы данных, хост, имя пользователя и пароль жестко закодированы в файле "main-local.php"

  'components' => [
    'db' => [
        'class' => 'yii\db\Connection',
        'dsn' => 'mysql:host=dbinstancename.xxxxx.region.rds.amazonaws.com;dbname=xxxxxxx',
        'username' => 'xxxxxxxx',
        'password' => 'xxxxxxxx',
        'charset' => 'utf8',
    ],

Я знаю, что не рекомендуется использовать жесткие коды данных базы данных в контейнере Docker.Я могу передать переменные окружения в докер во время выполнения так, чтобы «DB_HOST», «DB_NAME», «DB_USER», «DB_PASSWORD» с соответствующими значениями.Я могу видеть те же подробности внутри контейнера докера, набрав команду "env"

Как это можно использовать в main-local.php?мы можем напрямую заменить детали БД в коде переменными env?Это что-то должно быть сделано со стороны разработчиков?

1 Ответ

0 голосов
/ 23 марта 2019

Чтобы добавить поддержку env, вы можете использовать это расширение https://github.com/vlucas/phpdotenv

Просто установите его

composer.phar require vlucas/phpdotenv

Создать .env файл. Он должен быть в .gitignore и недоступен из Интернета. Если вы используете базовые или расширенные шаблоны, поместите его с yii.bat в корень проекта. Также вы можете создать .env.example с пустыми переменными.

YII_DEBUG=1
YII_TRACE_LEVEL=3
YII_ENV=dev

Затем добавьте его в свой index.php вот так

require_once __DIR__ . '/protected/vendor/autoload.php';

$factory = new Dotenv\Environment\DotenvFactory([
    new Dotenv\Environment\Adapter\EnvConstAdapter(),
]);
// Specify path to directory with .env file here (for advanced you should up twice)
\Dotenv\Dotenv::create(__DIR__ . DIRECTORY_SEPARATOR . '/../', null, $factory)->load();

defined('YII_DEBUG') or define('YII_DEBUG', (bool) $_ENV['YII_DEBUG']);
defined('YII_TRACE_LEVEL') or define('YII_TRACE_LEVEL', $_ENV['YII_TRACE_LEVEL']);
defined('YII_ENV') or define('YII_ENV', $_ENV['YII_ENV']);

Я рекомендую использовать только EnvConstAdapter. Причина $_SERVER переменная регистрируется, и getenv() некоторое время имеет пустые значения в запросах параллелизма.

Небольшое улучшение для bool, null и пустых строк. Добавьте это до $factory инстанцирования и используйте env() вместо $_ENV.

if (!function_exists('env')) {
    /**
     * Gets the value of an environment variable.
     * @param string $key
     * @param mixed $default
     * @return mixed
     */
    function env($key, $default = null)
    {
        if (!isset($_ENV[$key])) {
            return $default;
        }

        $value = $_ENV[$key];

        switch ($value) {
            case 'true':
            case '(true)':
                return true;
            case 'false':
            case '(false)':
                return false;
            case 'empty':
            case '(empty)':
                return '';
            case 'null':
            case '(null)':
                return null;
            default:
                return $value;
        }
    }
}
...