将env变量传递给docker-compose

时间:2020-07-17 20:01:23

标签: python docker redis docker-compose dockerfile

我已经用python和redis创建了一个示例docker应用。 Python连接到Redis以存储数据。我想将password servername作为docker-compose文件中的环境变量传递给redis。我该如何实现? Docker撰写:

version: "3.7"
services:
  nginx_app:
    image: nginx:latest 
    depends_on:
      - flask_app
    volumes:
      - ./default.conf:/etc/nginx/conf.d/default.conf
    ports:
      - 8082:80
    networks:
      - my_project_network
  flask_app:
    build:
      context: .
      dockerfile: Dockerfile
    expose:
      - 5000
    depends_on:
      - redis_app
    networks:
      - my_project_network
  redis_app:
    image: redis:latest
    command: redis-server --requirepass pass123 --appendonly yes
    volumes:
      - ./redis-vol:/data 
    expose:
      - 6379
    networks:
      - my_project_network
networks:
  my_project_network:
from flask import Flask
from redis import Redis

app = Flask(__name__)
redis = Redis(host='redis_app', port=6379, password='pass123')
@app.route('/')
def hello():
    redis.incr('hits')
    return 'Hello World! I have been seen %s times.' % redis.get('hits')
if __name__ == "__main__":
    app.run(host="0.0.0.0", debug=True)

2 个答案:

答案 0 :(得分:2)

只需在flask应用程序中定义环境变量,然后在python应用程序中对其进行os.getenv,然后将它们添加到docker撰写文件中的flask应用程序服务中即可:

flask_app:
  environment:
    RABBIT_USER: guest
    RABBIT_PASSWORD: pass123

在您的python文件中,以下位置:

import os

redis = Redis(host='redis_app', port=6379, password=os.getenv('RABBIT_PASSWORD'))

答案 1 :(得分:1)

正如@AndriyIvaneyko所说,在您的docker-compose中:

flask_app:
  environment:
    - PASSWORD=password

获得此值的另一种方法是在shell export PASSWORD="password"中设置一个env变量并将其导入到docker-compose中:

flask_app:
  environment:
    - PASSWORD

这是我推荐的方法,因为它可以确保您的凭据在docker-compose文件中不以纯文本显示。而且,由于env变量可以独立配置,因此协作变得更加简单。

在您的python中:

from flask import Flask
from redis import Redis
import os

app = Flask(__name__)
redis = Redis(host='redis_app', port=6379, password=os.getenv('PASSWORD'))
@app.route('/')
def hello():
    redis.incr('hits')
    return 'Hello World! I have been seen %s times.' % redis.get('hits')
if __name__ == "__main__":
    app.run(host="0.0.0.0", debug=True)

您可以对其他env变量执行相同的操作。 Here是文档。