【问题标题】:Cannot connect to Redis in Docker无法连接到 Docker 中的 Redis
【发布时间】:2023-02-10 19:56:26
【问题描述】:

我尝试从我的后端连接到 Redis,但我不断收到以下错误:

...
api-1    | [ioredis] Unhandled error event: Error: getaddrinfo ENOTFOUND undefined
api-1    |     at GetAddrInfoReqWrap.onlookup [as oncomplete] (node:dns:71:26)
api-1    | [ioredis] Unhandled error event: Error: getaddrinfo ENOTFOUND undefined
api-1    |     at GetAddrInfoReqWrap.onlookup [as oncomplete] (node:dns:71:26)
...

这是我配置我的 redis 客户端的方式:

import Redis from "ioredis";

export const redisConfig = () => {
  if (process.env.NODE_ENV === "production") {
    return `redis://${process.env.REDIS_HOST}:${process.env.REDIS_PORT}`;
  }
  return "";
};

const redisCli = new Redis(redisConfig());

export default redisCli;

这是我的码头文件:

# ---- Dependencies ---- 

FROM node:16-alpine AS base

# minimize image size
RUN apk add --no-cache libc6-compat 

RUN npm install -g npm@latest

WORKDIR /app

COPY ./package*.json ./

RUN npm ci


# ---- Builder ---- 

FROM node:16-alpine AS builder

RUN npm install -g npm@latest

WORKDIR /app

COPY --from=base /app/node_modules ./node_modules

COPY ./src ./src

COPY package*.json tsconfig.json webpack.config.ts ./

RUN npm run build


# ---- Release ---- 

FROM node:16 AS release

WORKDIR /app

# COPY ./prisma ./prisma 

# COPY ./.env ./

# COPY ./deployment ./deployment

COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/package.json ./

# RUN npx prisma generate

RUN npm install pm2 -g 

EXPOSE 3000

这是 docker-compose.yml:

version: "3"

services:
  api:
    build: ./

    depends_on:
      - redis

    links:
      - redis

    command: sh -c "node dist/server.js"

    environment:
      - REDIS_HOST=redis
      - REDIS_PORT=6379
      - NODE_ENV=production

    ports:
      - 3000:3000

  redis:
    image: "redis:latest"

我已经在 docker-compose 中指定了链接,但仍然收到相同的错误。 我该如何修复错误?谢谢你的帮助!!

【问题讨论】:

    标签: docker docker-compose redis ioredis


    【解决方案1】:

    您收到此错误是因为您的应用程序可能在 Redis 启动并可访问之前尝试连接到 Redis。在你的depends_on部分,你可以说你想在你的redis服务健康后启动你的应用程序。为此,您还必须配置健康检查以告知 Redis 何时真正准备好接受连接(例如 redis-cli ping)。

    这是对我有用的配置示例:

    version: "3"                                                                                                                                                                 
    
    services:
      api:
        build: ./
    
        depends_on:
          redis:
            condition: service_healthy
    
        links:
          - redis
    
        environment:
          - REDIS_HOST=redis
          - REDIS_PORT=6379
          - NODE_ENV=production
    
      redis:
        image: redis:latest
    
        healthcheck:
          test: ["CMD", "redis-cli", "ping"]
          interval: 1s
          timeout: 2s
          retries: 10
    

    【讨论】:

      【解决方案2】:

      能够将这样的配置连接到 Docker 中托管的 Redis

      ConfigurationOptions co = new ConfigurationOptions()
              {
                  SyncTimeout = 500000,
                  EndPoints =
                  {
                      { "127.0.0.1", 49155 }
                  },
                  AbortOnConnectFail = false // this prevents that error,
                  , Password = "redispw"
      
              };
      
      RedisConnectorHelper.lazyConnection = new Lazy<ConnectionMultiplexer>(() =>
              {
                  return ConnectionMultiplexer.Connect(co); 
              });
      

      其中 49155 是 doker 路径端口

      【讨论】:

        猜你喜欢
        • 2018-07-12
        • 2019-01-08
        • 1970-01-01
        • 2022-01-07
        • 2017-03-12
        • 1970-01-01
        • 1970-01-01
        • 2020-01-09
        • 2020-06-03
        相关资源
        最近更新 更多