使用 --link 访问 Docker 容器中的环境变量 link

Accessing environment variables in Docker containers linked with --link

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

我建议使用 fig 之类的东西,并在启动时将环境变量传递给两个容器。如果你真的想要你可以 docker inspect 任何其他容器的任何容器,如果你绑定安装 docker 套接字,然后做这样的事情:

docker inspect -f {{.Config.Env}} myapp-mysql

问题可能不是环境变量 - 可能是您的 PHP 安装。

TL;DR 当您 运行 您在 Apache 下的应用程序时可以访问的环境变量 & PHP 如果您是使用 nginx 或 lighttpd 和 fastcgi。

较长的版本

这是我的理解方式(它可能是错误的或不完整的,因为我对此的经验非常有限)。因为 PHP 不是 运行 作为带有 fastCGI 的 nginx 下浏览器的一部分,它无法访问启动浏览器的 shell 因此无法访问环境shell.

中的变量

解决方案是将您感兴趣的变量声明为配置的一部分。 This answer 有点简洁,但它包含了这个问题的基本答案。

我通过创建自定义 start.sh 脚本解决了这个问题,然后从我的 Dockerfile:

中调用该脚本
#!/bin/sh

# Function to update the fpm configuration to make the service environment variables available
function setEnvironmentVariable() {
    if [ -z "" ]; then
            echo "Environment variable '' not set."
            return
    fi

    # Check whether variable already exists
    if grep -q  /etc/php5/fpm/pool.d/www.conf; then
        # Reset variable
        sed -i "s/^env\[.*/env[] = /g" /etc/php5/fpm/pool.d/www.conf
    else
        # Add variable
        echo "env[] = " >> /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 }'`;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 脚本中访问它们。

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