将环境变量公开给Apache和PHP

时间:2016-03-12 02:24:19

标签: php apache ubuntu docker

背景

我试图使用Wercker来运行我的PHP应用程序测试。 Wercker使用Docker容器来设置测试环境以执行测试。它使用环境变量来公开任何连接服务(如MySQL和Elasticsearch)的连接参数。示例MYSQL_PORT_3306_TCP_ADDR = 127.0.1.1

我的核心Docker容器正在运行Ubuntu 14.04,PHP和Apache已经安装在容器上。

问题

当通过Apache运行时,我似乎无法通过php $ _SERVER或$ _ENV访问环境变量。如果我通过CLI php ./db_connect.php运行脚本,或者我使用其在服务器php -S localhost:8000中的内置运行PHP,它可以正常工作。但是,如果我尝试通过Apache虚拟主机访问页面,则环境变量不可用。

的进展

我已经使用用于允许环境变量的mod来设置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

我已经阅读了这个问题How to get system environment variables into PHP while running CLI & Apache2Handler?,但我不确定它的建议是什么。

问题

如何向Apache和PHP公开系统环境变量?

5 个答案:

答案 0 :(得分:2)

如果使用php official Docker image,则必须将环境变量从Apache显式传递到PHP。 您可以执行以下操作:

在您的Dockerfile中:

FROM php:7.2-apache
RUN echo 'SetEnv MYSQL_USER ${MYSQL_USER}' > /etc/apache2/conf-enabled/environment.conf

environment.conf是一个任意名称,但应放在/etc/apache2/conf-enabled/中。

在docker-compose.yml中:

version: '2'
services:
    yourservice:
        build: ./yourimage
        image: yourimage
        ports:
            - 8080:80
        volumes:
            - ../html:/var/www/html
        environment:
            MYSQL_USER: foo

在您的PHP脚本中:

echo getenv('MYSQL_USER');

答案 1 :(得分:1)

使用docker-compose,您可以通过php的environment变量检索使用docker-compose.yml文件的$_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

答案 2 :(得分:1)

如果您使用的是 php-fpm,您可以通过 clear_env 文件中的 /path/to/php/fpm/pool.d/www.conf ini 设置将环境变量从操作系统传递到 PHP-FPM:

clear_env = no

它适用于通过 docker-compose.yml 设置的 environment 变量,如下所示:

version: "..."

services:
    php-fpm:
        image: php:7-fpm
        environment:
            MY_VAR: my-value

重要提示:当然,风险在于您的 PHP-FPM 将可以访问所有操作系统环境变量。如果传递所有变量有问题,您还可以通过 www.conf 或另一个 php ini 配置文件仅传递特定变量:

; Pass environment variables like LD_LIBRARY_PATH. All $VARIABLEs are taken from
; the current environment.
env[MY_VAR] = $MY_VAR

答案 3 :(得分:0)

这是解决方案:

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>

这些现在可以通过$ _SERVER超级全局数组在PHP中访问。

<?php
    echo $_SERVER['MYSQL_ENV_MYSQL_USER'];

答案 4 :(得分:0)

您可以使用如下所示的php命令检查get env

php -r "echo getenv('MYSQL_USER');"