我的Flask应用程序不能看到在docker-compose中设置的环境变量,但容器中的python可以。有什么办法让Flask也能看到它们吗?我认为这是Apache没有传递环境变量的问题,但我似乎不能让它通过。
当我在docker容器中启动apache when服务器时,会出现以下错误:
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然后,我获取代码中的OS环境对象,并将其输出并获得以下内容:
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'})test变量就在那里。
为什么容器中的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>发布于 2020-06-17 12:54:27
好吧,我想通了。后来我又用谷歌搜索了一下,偶然发现了this post,上面解释了该怎么做。
上面场景的简短版本:问题是环境变量不可用于apache2传递到WSGI会话中。它们不能放在conf文件中,因为它没有访问bash的权限。解决方案是将以下行添加到/etc/environment下的环境文件中:
/etc/environment:
export TEST=${TEST}接下来,将此代码添加到/etc/apache2/envvars,以将环境文件链接到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可以访问环境变量了。另外,还有一个有趣的提示:记住在环境变量中转义特殊字符,否则会出现奇怪的问题!
https://stackoverflow.com/questions/62419053
复制相似问题