使用 --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
我正在 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