构建Docker的php开发环境,编写测试程序的时候,发现php的getenv方法一直都是返回的false,这是因为php-fpm清除了环境变量

验证环境变量是否存在

➜ docker exec -it $containerName env | grep HOSTNAME
HOSTNAME=php

PHP_FPM的配置

sudo vim /etc/php/php-fpm/php-fpm.d/www.conf
; Clear environment in FPM workers
; Prevents arbitrary environment variables from reaching FPM worker processes
; by clearing the environment in workers before env vars specified in this
; pool configuration are added.
; Setting to "no" will make all environment variables available to PHP code
; via getenv(), $_ENV and $_SERVER.
; Default Value: yes
clear_env = no 

在PHP-FPM的配置中默认是清除环境变量,因为考虑到在Docker容器之间的通讯是通过主机名的方式建立通讯,当然也可以写IP地址,但是IP地址每次重启容器都会发生变化,Docker也不建议使用IP地址,所以在Docker的环境中不能清除环境变量,在Docker的容器中环境变量也是非常小的,都是需要用到的环境变量

docker exec dockerphp_php_1 env

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=php
MYSQL_PASSWORD=node-app
REDIS_HOST=redis
MYSQL_DATABASE=node-app
NGINX_PORT=3000
MYSQL_ROOT_PASSWORD=node-app
NODE_ENV=development
MYSQL_USER=node-app
DB_HOST=mysql
APP_PORT=9000
MONGO_HOST=mongo
REDIS_CONF=/usr/local/etc/redis/redis.conf
PHP_HOST=php
HOME=/root

在PHP-FPM中还有另一种方传递环境变量到PHP-FPM的进程中,可以选择性使用环境变量

sudo vim /etc/php/php-fpm/php-fpm.d/www.conf
; Pass environment variables like LD_LIBRARY_PATH. All $VARIABLEs are taken from
; the current environment.
; Default Value: clean env
;env[HOSTNAME] = $HOSTNAME
;env[PATH] = /usr/local/bin:/usr/bin:/bin
;env[TMP] = /tmp
;env[TMPDIR] = /tmp
;env[TEMP] = /tmp

如果你使用的Apache

在Apache中的配置

<VirtualHost hostname:80>
   ...
   SetEnv VARIABLE_NAME variable_value
   ...
</VirtualHost>

为什么限制对环境变量的访问

在网上没有找到资料,可能是处于安全的考虑,或者考虑到系统环境变量太多的原因

参考链接issues

我的Docker开发环境Github