【问题标题】:Pass env variable to docker-compose将环境变量传递给 docker-compose
【发布时间】:2020-11-07 16:13:25
【问题描述】:

我已经使用 python 和 redis 创建了一个示例 docker 应用程序。 Python连接redis来存储数据。我想将 password servername 作为 docker-compose 文件中的环境变量传递给 redis。我怎样才能做到这一点? 码头工人撰写:

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)

【问题讨论】:

    标签: python docker redis docker-compose dockerfile


    【解决方案1】:

    只需在烧瓶应用程序中定义环境变量并在 python 应用程序中执行它们的 os.getenv,而不是在 docker compose 文件中将它们添加到您的烧瓶应用程序服务:

    flask_app:
      environment:
        RABBIT_USER: guest
        RABBIT_PASSWORD: pass123
    
    

    在你的python文件中如下:

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

    【讨论】:

    • 我在问题中添加了我的python文件你能告诉我在哪里添加os.getenv吗?对不起,我是新手,这个愚蠢的问题
    • 如何在 redis_app: command: where it say --requirepass 中给出 env 变量?
    • 在你的 shell 中设置环境变量并使用${PASSWORD} 将它传递给你的 docker-compose
    【解决方案2】:

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

    flask_app:
      environment:
        - PASSWORD=password
    

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

    flask_app:
      environment:
        - PASSWORD
    

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

    在你的蟒蛇中:

    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)
    

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

    【讨论】:

    • 这真的是我的回答人的完全逻辑重复,你在回答之前检查过现有的答案吗? ?
    • @AndriyIvaneyko 用替代方法更新!
    猜你喜欢
    • 2020-02-23
    • 2021-11-27
    • 2017-09-18
    • 2018-08-23
    • 1970-01-01
    • 2019-06-06
    • 1970-01-01
    • 2018-12-18
    相关资源
    最近更新 更多