【问题标题】:Redis works on deployment , It doesn't work on production with docker and herokuRedis 适用于部署,不适用于 docker 和 heroku 的生产环境
【发布时间】:2021-02-08 03:19:58
【问题描述】:

我正在尝试开发一个 express api。它可以在本地机器上按预期工作。我正在使用 docker,但在使用 docker 和 heroku redis 进行生产时无法正常工作

Dockerfile

FROM node:latest

WORKDIR /usr/src/app

COPY package*.json ./

RUN npm install 

COPY . .

EXPOSE 5000

CMD ["npm","start"]

docker.compose.yml 文件

version: '3'
services:

  mongo:
    container_name: mongo
    image: mongo
  
    ports:
      - '27017:27017'
  redis:
    container_name: redis
    image: redis
    

  app:
    container_name: password-manager-docker
    image: app
    restart: always
    build: .
    
    ports:
      - '80:5000'
    links: 
      - mongo
      - redis
    environment: 
      MONGODB_URI: ${MONGODB_URI}
      REDIS_URL: ${REDIS_URL}   
      clientID: ${clientID}
      clientSecret : ${clientSecret}
      PORT: ${PORT}
      REDIS_HOST: ${REDIS_HOST}
      JWT_SECRET_KEY: ${JWT_SECRET_KEY}
      JWT_EXPIRE: ${JWT_EXPIRE}
      REFRESH_TOKEN: ${REFRESH_TOKEN}
      JWT_REFRESH_SECRET_KEY: ${JWT_REFRESH_SECRET_KEY}
      JWT_REFRESH_EXPIRE: ${JWT_REFRESH_EXPIRE}
      JWT_COOKIE: ${JWT_COOKIE}
      SMTP_HOST: ${SMTP_HOST}
      SMTP_PORT: ${SMTP_PORT}
      SMTP_USER: ${SMTP_USER}
      SMTP_PASS: ${SMTP_PASS}

redis 文件

const asyncRedis = require('async-redis');
//process.env.REDIS_HOST's value is redis
const redisClient = asyncRedis.createClient({port:6379,host:process.env.REDIS_HOST || "127.0.0.1"});
redisClient.on("connect",() => {
  console.log(`Redis: ${host}:${port}`);
})
redisClient.on('error', function(err) {
  // eslint-disable-next-line no-console
  console.log(`[Redis] Error ${err}`);
});

heroku 上的错误是“[Redis] Error Error: Redis connection to 127.0.0.1:6379 failed - connect ECONNREFUSED 127.0.0.1:6379”。它在没有 docker 的情况下在 heroku 上工作,但不是它不工作。感谢您的帮助

【问题讨论】:

  • 查看redis服务器是否在运行
  • Api 在本地可以正常工作,并且 redis 服务器正在运行
  • 您是否设置了$REDIS_HOST 环境变量?在此 Compose 设置的上下文中,将其设置为 docker-compose.yml 文件中的固定容器名称是否有效?
  • 是的,我把它设置为redis

标签: node.js docker heroku redis docker-compose


【解决方案1】:
  1. 安装redis

    sudo apt-get install redis-server

  2. 运行命令检查是否一切正常

    sudo service redis-server status

如果您收到消息redis-server is running,那么它会解决

【讨论】:

  • 我使用的是 windows 机器,而且我的问题是生产而不是本地
【解决方案2】:

环境变量 REDIS_HOST 未设置 - 您的问题中已有答案,错误是:ECONNREFUSED 127.0.0.1:6379 主机地址来自您的 if 语句:{port:6379,host:process.env.REDIS_HOST || "127.0.0.1"} 如果未设置 process.env.REDIS_HOST,则使用 127.0.0.1 作为主机地址。您必须在运行 docker-compose 时解析配置文件或通过 -e KEY=VAL 设置它,或者只需编辑行 REDIS_HOST: ${REDIS_HOST} 并将 ${REDIS_HOST} 替换为 docker-compose.yml 文件中的服务名称(redis)或。 ..,有很多可能性。如果你想知道redis容器的真实ip,请查看docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' <CONTAINER_ID/NAME>

【讨论】:

  • 感谢您的回答,但我已经在 .env 中设置了 REDIS_HOST=redis
  • 我也设置在 heroku 中。 [Redis] Error 错误:Redis 连接到 redis:6379 失败 - getaddrinfo ENOTFOUND redis
  • 有空可以帮忙
  • 啊 heroku 是你的产品环境?!不确定它是如何工作的,docker-compose 和 .env 是用于本地开发的,你可以用 heroku 做的就是将你的容器镜像推送给它们(devcenter.heroku.com/articles/…)。 docker-compose.yml、Dockerfile 和 .env-file 的全部信息似乎没用,你不将 redis 和 mongo 容器推送到 heroku,你使用他们的 redis/mongo 容器,并且文档没有太多关于启动容器的说明(只花了一个简短的外观)。
  • 那么,我到底应该怎么做呢?有什么推荐吗?
【解决方案3】:

我终于想通了。我将heroku中的redis插件从heroku redis改为redis to go并更改了这一行

const redisClient = asyncRedis.createClient({port:6379,host:process.env.REDIS_HOST || "127.0.0.1"});

const redisClient = asyncRedis.createClient(process.env.REDISTOGO_URL);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-13
    • 2018-12-15
    • 1970-01-01
    • 2018-10-10
    • 2013-11-08
    • 2018-12-18
    • 2021-04-28
    相关资源
    最近更新 更多