访问与--link链接的Docker容器中的环境变量

时间:2015-02-05 14:39:56

标签: mysql environment-variables docker php

我在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容器的环境变量?

4 个答案:

答案 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有点简洁,但它包含了解决这个问题的基本答案。