Apache托管Flask无法看到Docker环境变量。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Apache托管Flask无法看到Docker环境变量。相关的知识,希望对你有一定的参考价值。

我的 Flask 应用程序无法看到在 docker-compose 中设置的环境变量,但容器中的 python 可以。有什么办法能让Flask也能看到它们?我认为这是Apache没有传递环境变量的问题,但我似乎无法让它传递。

当我在docker容器中启动apache webserver时,这个错误就会出现。

Starting Apache httpd web server: apache2[Tue Jun 16 23:12:00.810164 2020] [env:warn] [pid 1311:tid 139882286290048] AH01506: PassEnv variable TEST was undefined

我在docker容器中定义了环境变量 就像这样

ai:
image: ai:dev
environment:
  TEST: test

然后我在代码中抓取操作系统的environ对象并输出,得到的结果是:

environ({'APACHE_RUN_DIR': '/var/run/apache2', 'APACHE_PID_FILE': '/var/run/apache2/apache2.pid', 'PATH': '/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin', 'APACHE_LOCK_DIR': '/var/lock/apache2', 'LANG': 'C', 'APACHE_RUN_USER': 'www-data', 'APACHE_RUN_GROUP': 'www-data', 'APACHE_LOG_DIR': '/var/log/apache2', 'PWD': '/'})

如果我进入容器,加载python并尝试,我得到这样的结果。

environ({'HOSTNAME': 'd3ce1f616cad', 'PYTHON_VERSION': '3.8.2', 'PWD': '/app', 'HOME': '/root', 'LANG': 'C.UTF-8', 'GPG_KEY': 'E3FF2839C048B25C084DEBE9B26995E310250568', 'PYTHONPATH': ':/app', 'TERM': 'xterm', 'SHLVL': '1', 'PYTHON_PIP_VERSION': '20.0.2', 'PYTHON_GET_PIP_SHA256': '421ac1d44c0cf9730a088e337867d974b91bdce4ea2636099275071878cc189e', 'PYTHON_GET_PIP_URL': 'https://github.com/pypa/get-pip/raw/d59197a3c169cef378a22428a3fa99d33e080a5d/get-pip.py', 'PATH': '/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin', 'TEST': 'test', '_': '/usr/local/bin/python'})

测试变量就在那里

为什么容器中的python可以看到这个变量,而我在同一个容器中的flask应用却看不到?以下是wsgi和conf文件,如果它们能帮上忙的话。

ai. wsgi:

`#!/usr/bin/python3.8
import sys
import logging
import os

logging.basicConfig(stream=sys.stderr)
sys.path.insert(0,"/var/www/ai/")

from ai import app as application`

ai.conf:

Listen 443
<VirtualHost *:443>
                ServerName 192.168.1.103
                ServerAdmin admin@tsames.ca
                WSGIScriptAlias / /var/www/ai/ai.wsgi
                <Directory /var/www/ai/ai/>
                        Order allow,deny
                        Allow from all
                </Directory>
                ErrorLog ${APACHE_LOG_DIR}/ai-error.log
                LogLevel warn
                CustomLog ${APACHE_LOG_DIR}/ai-access.log combined
                PassEnv TEST
</VirtualHost>
答案

好吧,我想明白了。后来我又上网查了一下,偶然发现了 此职位 解释了该怎么做。

简而言之,我的上述情况:问题是环境变量不能被apache2传递到WSGI会话中。它们不能被放在conf文件中,因为它不能访问bash。解决方法是在 etcenvironment 的 evironment 文件中添加这一行。

/etc/environment:
export TEST=${TEST}

接下来,在etcapache2envvars中加入这行,将环境文件与apache连接起来,它可以访问bash,所以它可以工作。

/etc/apache2/envvars:
... (Default file stuff)
. /etc/environment

最后,在conf文件中,你要加入(就像我上面做的那样):

/etc/apache2/sites-enabled/ai.conf:
Listen 443
<VirtualHost *:443>
                ServerName 192.168.1.103
                ServerAdmin admin@admin.com
                WSGIScriptAlias / /var/www/ai/ai.wsgi
                <Directory /var/www/ai/ai/>
                        Order allow,deny
                        Allow from all
                </Directory>
                ErrorLog ${APACHE_LOG_DIR}/ai-error.log
                LogLevel warn
                CustomLog ${APACHE_LOG_DIR}/ai-access.log combined
                PassEnv TEST
</VirtualHost>

注意PassEnv,现在apache可以访问环境变量了,它就可以工作了。另外,还有一个有趣的注意点:记得在环境变量中转义特殊字符,否则会出现奇怪的问题。

以上是关于Apache托管Flask无法看到Docker环境变量。的主要内容,如果未能解决你的问题,请参考以下文章

Flask Docker 容器 SocketIO 问题

手把手教你用 Flask,Docker 和 Kubernetes 部署Python机器学习模型(附代码)

docker 部署 flask配置环境及测试

使用 EBS 部署多容器 docker 环境(flask 和 nginx)

apache+mod_wsgi+flask 环境搭建

无法在 Docker 中为 Flask 应用程序运行 pytest\requests 测试