docker-compose设置环境变量不起作用

时间:2018-12-11 04:40:31

标签: docker docker-compose

我使用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设置中是否存在任何错误的代码?

谢谢。

2 个答案:

答案 0 :(得分:1)

[已解决]

这是由主管造成的。

使用超级用户时,其外壳与原始外壳隔离。

因此我们必须将环境变量定义为supervisor.conf

答案 1 :(得分:0)

您的烧瓶代码看起来不错,就像您所说的……在bash中,此ENV变量存在,

我对您的建议是找到在项目中将此变量放入.env文件的方法。

我将解释为什么我对cron遇到的类似问题这么说:

cron在他的“自己的世界”中运行,因为系统运行并执行它,并且因为它,他不共享主容器进程的bash持有的那些ENV变量。

因此,我假设(如果没有请提供反馈)烧瓶在他的“自己的世界”中也以类似的方式运行,并且无法访问Docker设置的ENV。

因此,为此,我创建了bash脚本,该脚本读取所有ENV变量并将其写入项目的.env文件,此脚本在创建容器之后运行。

这样,无论您从何处以及如何运行代码/脚本,这些ENV变量将始终存在。