【问题标题】:Cannot connect to redis container无法连接到redis容器
【发布时间】:2020-11-09 01:14:51
【问题描述】:

我正在尝试使用环境变量将 redis 容器连接到 python 应用程序容器。我将密码作为环境变量传递但它没有连接,如果我不使用环境变量并对密码进行硬编码,它可以正常工作,否则它会给出redis.exceptions.ConnectionError

version: "3.7"
services:
  nginx_app:
    image: nginx:latest
    depends_on:
      - flask_app
    volumes:
      - ./default.conf:/etc/nginx/conf.d/default.conf
    ports:
      - 8090:80
    networks:
      - my_project_network

  flask_app:
    build:
      context: .
      dockerfile: Dockerfile
    expose:
      - 5000
    environment:
      - PASSWORD=pass123a
    depends_on:
      - redis_app
    networks:
      - my_project_network

  redis_app:
    image: redis:latest
    command: redis-server --requirepass ${PASSWORD} --appendonly yes
    environment:
      - PASSWORD=pass123a
    volumes:
      - ./redis-vol:/data 
    expose:
      - 6379
    networks:
      - my_project_network
networks:
  my_project_network:

index.py

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)

【问题讨论】:

    标签: python docker redis docker-compose


    【解决方案1】:

    更新你的 docker-compose.yaml

    环境是一个字符串列表:

    docker-composer 对 ${ENV} 进行插值,其中 ENV 的值是从 .env 文件加载的

    用途:

    command: redis-server --requirepass $PASSWORD --appendonly yes
    

    代替:

    command: redis-server --requirepass ${PASSWORD} --appendonly yes
    

    您可以通过以下方式验证容器内的环境变量:

    docker-compose run --rm flask_app printenv | grep PASSWORD
    

    应该返回:

    PASSWORD=pass123a
    

    docker-compose 环境变量示例:Here

    【讨论】:

    • 我已经在 docker-compose 文件中添加了它。它不工作
    • 我已经更新了我的答案,环境是你写错的字符串列表。
    • 我已经对其返回 PASSWORD=wahaj123a 进行了更改,但是当我转到本地主机时,它仍然显示 redis.exceptions.ConnectionError: Error -2 connecting to redis_app:6379. Name or service not known. 我已将我的问题更新为当前的 docker-compose 文件,并进行了您建议的更改仍然有同样的错误
    • 在同一文件夹中创建 .env 文件并添加这一行 PASSWORD=wahaj123a 然后尝试docker-compose down && docker-compose up
    • 这应该对你有帮助:stackoverflow.com/questions/4906977/…
    【解决方案2】:

    您似乎错过了将环境变量传递给您的 Redis 容器。

    试试这个:

    version: "3.7"
    services:
      nginx_app:
        image: nginx:latest 
        #LOCAL IMAGE
        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
        environment:
          - PASSWORD=pass123a
        depends_on:
          - redis_app
        networks:
          - my_project_network
    
      redis_app:
        image: redis:latest
        command: redis-server --requirepass ${PASSWORD} --appendonly yes
        environment:
          - PASSWORD=pass123a
        volumes:
          - ./redis-vol:/data 
        expose:
          - 6379
        networks:
          - my_project_network
    networks:
      my_project_network:
    

    【讨论】:

    • 我已经进行了更改并更新了我的问题,但是当我转到本地主机时,它仍然显示redis.exceptions.ConnectionError: Error -2 connecting to redis_app:6379. Name or service not known.
    • 当我将此--requirepass wahaj123a 更改为--requirepass ${PASSWORD} 时,它会给出错误redis.exceptions.ConnectionError: Error -2 connecting to redis_app:6379. Name or service not known.
    • 检查容器是否正在运行。它可能因错误而关闭
    猜你喜欢
    • 2022-01-07
    • 1970-01-01
    • 1970-01-01
    • 2023-02-11
    • 1970-01-01
    • 1970-01-01
    • 2020-02-08
    • 2020-12-23
    • 2020-06-07
    相关资源
    最近更新 更多