Я пытаюсь использовать Wercker для запуска моего теста для приложения PHP. Wercker использует контейнеры Docker для настройки тестовой среды для выполнения тестов. Он использует переменные среды для отображения параметров подключения для любых подключенных сервисов, таких как MySQL и Elasticsearch. Пример MYSQL_PORT_3306_TCP_ADDR = 127.0.1.1
В моих основных контейнерах Docker работает Ubuntu 14.04 с PHP и Apache, уже установленными на контейнере.
Кажется, я не могу получить доступ к переменным среды через php $ _SERVER или $ _ENV при работе через Apache. Он отлично работает, если я запускаю скрипт через CLI php./db_connect.php
или если я запускаю PHP, используя его сборку на сервере php -S localhost:8000
. Однако, если я попытаюсь получить доступ к странице через виртуальный хост Apache, переменные окружения недоступны.
Я установил Apache с модом, используемым для разрешения переменных окружения "Я думаю",
sudo a2enmod env
sudo service apache2 restart
Я пытаюсь получить доступ к переменным среды в моем скрипте.
$database_host = $_SERVER["MYSQL_PORT_3306_TCP_ADDR"];
$database_username = $_SERVER["MYSQL_ENV_MYSQL_USER"];
$database_password = $_SERVER["MYSQL_ENV_MYSQL_PASSWORD"];
$database_name = $_SERVER["MYSQL_ENV_MYSQL_DATABASE"];
$elasticsearch_host = $_SERVER["ELASTICSEARCH_PORT_9300_TCP_ADDR"];
Я могу добавить новые переменные в свой.htaccess, я просто не получаю все переменные среды системы.
SetEnv TEST_VAR test
Я прочитал этот вопрос. Как получить переменные системной среды в PHP при запуске CLI и Apache2Handler? но я не уверен, что он предлагает делать.
Как открыть переменные System Environment для Apache и PHP?
С компоновкой докеров вы можете получить переменные среды операционной системы, заданные параметром environment
файла docker-compose.yml, через переменную php $_ENV
.
version: 2
services:
web:
build: php:5.6-apache
environment:
MYSQL_USER: "user"
MYSQL_PASSWORD: "passwd"
должен дать вам
$_ENV['MYSQL_USER'] = user
$_ENV['MYSQL_PASSWORD'] = passwd
Я не уверен, как Wercker сопоставляет переменные среды с контейнерами, но есть эта открытая проблема, которая, я думаю, может помочь https://github.com/wercker/wercker/issues/63
Вот решение:
Docker передает их в apache, но вам нужно настроить apache, чтобы сделать их доступными для PHP.
Установите значения в вашем локальном файле .env
MYSQL_PORT_3306_TCP_ADDR=1234
MYSQL_ENV_MYSQL_USER=development
MYSQL_ENV_MYSQL_PASSWORD=password
Затем добавьте их в качестве параметров среды в файл docker-compose.yml
version: 2
services:
web:
build: php:5.6-apache
environment:
MYSQL_PORT_3306_TCP_ADDR:${MYSQL_PORT_3306_TCP_ADDR}
MYSQL_ENV_MYSQL_USER: ${MYSQL_ENV_MYSQL_USER}
MYSQL_ENV_MYSQL_PASSWORD: ${MYSQL_ENV_MYSQL_PASSWORD}
Затем, чтобы передать их в PHP, установите их как параметры среды в вашей конфигурации виртуального хоста.
<VirtualHost *:80>
ServerName some-project
ServerAdmin webmaster@localhost
DocumentRoot /var/www/some-project
# Set apache environment variables
SetEnv MYSQL_PORT_3306_TCP_ADDR ${MYSQL_PORT_3306_TCP_ADDR}
SetEnv MYSQL_ENV_MYSQL_USER ${MYSQL_ENV_MYSQL_USER}
SetEnv MYSQL_ENV_MYSQL_PASSWORD ${MYSQL_ENV_MYSQL_PASSWORD}
</VirtualHost>
Теперь они будут доступны в PHP через суперглобальный массив $ _SERVER.
<?php
echo $_SERVER['MYSQL_ENV_MYSQL_USER'];
$_ENV['MYSQL_PORT_3306_TCP_ADDR']
? Обратите внимание, что переменные среды для ссылок устарели и больше не устанавливаются для новых пользовательских сетей в Docker 1.9 и выше. Лучший способ - подключиться, используя имя связанного контейнера, например,http://mysql
для подключения к контейнеру «mysql». Переменные среды мало что добавили, потому что для получения IP-адреса вам нужны и имя, и номер порта , поэтому в любом случае проще использовать имя контейнера.