我在Docker容器中为我的应用程序设置开发环境,目前我有这些容器:
myapp-data - Holds application source code and log files
myapp-phpfpm - Runs the php5-fpm process for Nginx
myapp-nginx - Runs the Nginx web server that serves the application
这个设置很漂亮,我真的很开心。但我的应用程序需要一个MySQL数据库才能连接,所以我使用official MySQL image,然后运行它:
sudo docker run --name myapp-mysql -e "MYSQL_ROOT_PASSWORD=iamroot" -e "MYSQL_USER=redacted" -e "MYSQL_PASSWORD=redacted" -e "MYSQL_DATABASE=redacted" -d mysql
这也很有效。但是我的myapp-phpfpm
容器需要链接到myapp-mysql
容器,以便将MySQL的连接详细信息暴露给我的应用程序。所以我重新启动myapp-phpfpm
容器:
sudo docker run --privileged=true --name myapp-phpfpm --volumes-from myapp-data --link myapp-mysql:mysql -d readr/phpfpm
所以现在我的myapp-phpfpm
容器已链接到我的myapp-mysql
容器,所以我应该可以在PHP应用程序中访问数据库。
问题是我无法解决。环境变量不存在于PHP应用程序中。如果我这样做:
die(var_dump(`printenv`));
我没有获得MySQL环境变量。为了尝试调试,我做了一个whoami
来找出PHP运行的用户,www-data
。然后,我在容器内创建了一个bash进程,使用su www-data
成为www-data
用户并在那里进行了printenv
。果然,MySQL环境变量确实存在:
MYSQL_PORT_3306_TCP_PORT=3306
MYSQL_PORT_3306_TCP=tcp://172.17.1.118:3306
MYSQL_ENV_MYSQL_ROOT_PASSWORD=iamroot
... etc ...
那么,我如何访问Docker在PHP中公开我的myapp-mysql
容器的环境变量?
答案 0 :(得分:1)
我通过创建自定义start.sh
脚本解决了这个问题,然后从Dockerfile
调用该脚本:
#!/bin/sh
# Function to update the fpm configuration to make the service environment variables available
function setEnvironmentVariable() {
if [ -z "$2" ]; then
echo "Environment variable '$1' not set."
return
fi
# Check whether variable already exists
if grep -q $1 /etc/php5/fpm/pool.d/www.conf; then
# Reset variable
sed -i "s/^env\[$1.*/env[$1] = $2/g" /etc/php5/fpm/pool.d/www.conf
else
# Add variable
echo "env[$1] = $2" >> /etc/php5/fpm/pool.d/www.conf
fi
}
# Grep for variables that look like MySQL (MYSQL)
for _curVar in `env | grep MYSQL | awk -F = '{print $1}'`;do
# awk has split them by the equals sign
# Pass the name and value to our function
setEnvironmentVariable ${_curVar} ${!_curVar}
done
# start php-fpm
exec /usr/sbin/php5-fpm
然后将环境变量添加到PHP5-FPM配置中,以便可以从PHP脚本中访问它们。
答案 1 :(得分:1)
php-fpm默认清除所有环境变量/etc/php5/fpm/pool.d/www.conf
:
; Setting to "no" will make all environment variables available to PHP code
; via getenv(), $_ENV and $_SERVER.
; Default Value: yes
;clear_env = no
您可以通过在Dockerfile
RUN sed -i -e "s/;clear_env\s*=\s*no/clear_env = no/g" /etc/php5/fpm/pool.d/www.conf
答案 2 :(得分:0)
我建议使用像fig这样的东西,然后在启动时将env vars传递给两个容器。如果你真的希望你可以docker inspect
任何其他容器的任何容器,如果你绑定安装docker socket,那么做这样的事情:
docker inspect -f {{.Config.Env}} myapp-mysql
答案 3 :(得分:0)
问题可能不是环境变量 - 可能是您的PHP安装。
在Apache& A下运行应用程序时可以访问的TL; DR 环境变量如果您使用的是nginx或lighttpd和fastcgi,PHP可能无法使用。
版本较长
这是我理解它的方式(它可能是错误的或不完整的,因为我对此的体验非常有限)。因为PHP没有在带有fastCGI的nginx下作为浏览器的一部分运行,所以它无法访问启动浏览器的shell,因此无法访问该shell中的环境变量。
解决方案是将您感兴趣的变量声明为配置的一部分。 This answer有点简洁,但它包含了解决这个问题的基本答案。