我使用docker
,也使用docker-compose
来绑紧每个容器。
在我的python flask代码中,请像这样引用环境变量。
import os
from app import db, create_app
app = create_app(os.getenv('FLASK_CONFIGURATION') or 'development')
if __name__ == '__main__':
print(os.getenv('FLASK_CONFIGURATION'))
app.run(host='0.0.0.0', debug=True)
还有docker-compose.yml。
version: '3.7'
services:
nginx:
build:
context: .
dockerfile: docker/nginx/dockerfile
container_name: nginx
hostname: nginx-prod
ports:
- '80:80'
networks:
- backend
links:
- web_project
depends_on:
- web_project
environment:
- FLASK_CONFIGURATION=production
mongodb:
build:
context: .
dockerfile: docker/mongodb/dockerfile
container_name: mongodb
hostname: mongodb-prod
ports:
- '27017:27017'
networks:
- backend
web_project:
build:
context: .
dockerfile: docker/web-prod/dockerfile
container_name: web_project
hostname: web_project_prod
ports:
- '5000:5000'
networks:
- backend
tty: true
depends_on:
- mongodb
links:
- mongodb
environment:
- FLASK_CONFIGURATION=production
networks:
backend:
driver: 'bridge'
我通过环境命令设置了FLASK_CONFIGURATION=production
。
但是当我执行时,也许FLASK_CONFIGURATION=production
无效。
我还尝试ENV FLASK_CONFIGURATION production
到每个dockerfile。 (也不起作用)
奇怪的是,当我通过bash(docker exec -it bash)输入我的容器并通过export检查环境变量时,它设置得很好。
我的docker设置中是否存在任何错误的代码?
谢谢。
答案 0 :(得分:1)
[已解决]
这是由主管造成的。
使用超级用户时,其外壳与原始外壳隔离。
因此我们必须将环境变量定义为supervisor.conf
答案 1 :(得分:0)
您的烧瓶代码看起来不错,就像您所说的……在bash中,此ENV变量存在,
我对您的建议是找到在项目中将此变量放入.env文件的方法。
我将解释为什么我对cron遇到的类似问题这么说:
cron在他的“自己的世界”中运行,因为系统运行并执行它,并且因为它,他不共享主容器进程的bash持有的那些ENV变量。
因此,我假设(如果没有请提供反馈)烧瓶在他的“自己的世界”中也以类似的方式运行,并且无法访问Docker设置的ENV。
因此,为此,我创建了bash脚本,该脚本读取所有ENV变量并将其写入项目的.env文件,此脚本在创建容器之后运行。
这样,无论您从何处以及如何运行代码/脚本,这些ENV变量将始终存在。