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 和 Kubernetes 部署Python机器学习模型(附代码)