首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Apache托管Flask看不到Docker环境变量

Apache托管Flask看不到Docker环境变量
EN

Stack Overflow用户
提问于 2020-06-17 07:20:56
回答 1查看 223关注 0票数 0

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

当我在docker容器中启动apache when服务器时,会出现以下错误:

代码语言:javascript
复制
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组合中定义我的环境变量,如下所示:

代码语言:javascript
复制
ai:
image: ai:dev
environment:
  TEST: test

然后,我获取代码中的OS环境对象,并将其输出并获得以下内容:

代码语言:javascript
复制
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并尝试,我会得到这样的结果:

代码语言:javascript
复制
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:

代码语言:javascript
复制
`#!/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:

代码语言:javascript
复制
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>
EN

回答 1

Stack Overflow用户

发布于 2020-06-17 12:54:27

好吧,我想通了。后来我又用谷歌搜索了一下,偶然发现了this post,上面解释了该怎么做。

上面场景的简短版本:问题是环境变量不可用于apache2传递到WSGI会话中。它们不能放在conf文件中,因为它没有访问bash的权限。解决方案是将以下行添加到/etc/environment下的环境文件中:

代码语言:javascript
复制
/etc/environment:
export TEST=${TEST}

接下来,将此代码添加到/etc/apache2/envvars,以将环境文件链接到apache,它可以访问bash,这样它就可以工作了:

代码语言:javascript
复制
/etc/apache2/envvars:
... (Default file stuff)
. /etc/environment

最后,在您放入的conf文件中(如我上面所做的):

代码语言:javascript
复制
/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可以访问环境变量了。另外,还有一个有趣的提示:记住在环境变量中转义特殊字符,否则会出现奇怪的问题!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62419053

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档