通过docker容器连接Bull Queue到redis的问题

问题描述 投票:0回答:1

我已经多次看到这个问题,但从未找到适合我的正确答案,所以我会尝试一下。

我已经在自己的 docker 容器中使用了 Bull Queue 的工作服务。 然后我将 redis 放在一个单独的容器中。当 Redis 位于容器中且工作程序在本地运行时,一切正常,但现在工作程序仅打印 Errorconnecting to Redis: Error: connect ECONNREFUSED 127.0.0.1:6379 在 TCPConnectWrap.afterConnect [作为未完成] (节点:net:1278:16) { 错误号:-111, 代码:'ECONNREFUSED', 系统调用:'连接', 地址:'127.0.0.1', 端口:6379 }

我觉得有点奇怪,因为我在设置 Bull 时指的是容器名称。事实上,无论我在设置中将主机更改为什么,它都会打印相同的错误。除非我在本地运行工作程序,否则它会打印我输入的主机。 我还尝试更改“connectionName”字段而不进行任何更改。

Docker 组成:

version: '3.1'
services:
  redis:
    image: redis:latest
    restart: always
    container_name: my_cache
    ports:
      - '6379:6379'
    command: redis-server --save 20 1 --loglevel warning --requirepass pirate
    volumes:
      - redis-data:/data
  worker:
    image: worker
    build: ../worker
    environment:
      - REDIS_HOST=local:redis:6379
    ports:
      - "6000:6000"
    links:
      - redis
volumes:
  redis-data:
    driver: local

队列.ts

import Bull from "bull";

export const gameEventQueue = new Bull("game-event", {
    redis: {
        host: 'redis',
        password: "pirate"
    }
});

公牛版本 "牛": "^4.12.2", "牛栏": "^2.1.3",

我也尝试在 docker compose 中设置 ENV 像这样

 worker:
    image: worker
    build: ../worker
    environment:
      - REDIS_HOST=local:redis:6379

然后像这样连接,

import Bull from "bull";

export const gameEventQueue = new Bull("game-event", {
    redis: {
        host: process.env.REDIS_HOST,
        password: "pirate"
    }
});

但仍然没有喜悦。我感谢所有帮助

node.js docker redis node-redis
1个回答
0
投票

Redis 容器的网络名称将只是

redis
。这是一个演示设置。

🗎

docker-compose.yml

version: '3.1'
services:
  redis:
    image: redis:latest
    restart: always
    container_name: cache
    ports:
     - '6379:6379'
    command: redis-server --save 20 1 --loglevel warning --requirepass pirate
    logging:
      driver: "none"
  worker:
    image: worker
    container_name: worker
    build:
      context: .
      dockerfile: Dockerfile
    environment:
      - REDIS_HOST=redis
      - REDIS_PORT=6379
      - REDIS_PASSWORD=pirate

我抑制

redis
服务的输出只是为了保持干净。三个环境变量被传递到
worker
服务,其中包括 Redis 容器的网络主机和端口以及密码。

现在是工作人员的简单 Docker 映像。只需要

iputils-ping
包,以便我们可以在工作线程中运行
ping

🗎

Dockerfile

FROM ubuntu:22.04

RUN apt update -q && apt install -q -y redis-tools iputils-ping

COPY worker.sh .

CMD ["bash", "worker.sh"]

最后是一个工作脚本,它只是一个简单的 BASH 脚本,演示了如何连接到 Redis 容器。这就是它的作用:

  1. 使用
    ping
    从 Redis 容器中回显数据包。
  2. 使用
    redis-cli
    PING
    命令发送到 Redis 服务器。

🗎

worker.sh

#!/bin/bash

echo "Worker starting... done!"

echo "Redis at $REDIS_HOST:$REDIS_PORT."

ping -c 5 $REDIS_HOST

echo "Sending PING to Redis..."

redis-cli -h $REDIS_HOST -p $REDIS_PORT -a $REDIS_PASSWORD PING

echo "Done!"

echo "Worker stopping... done!"

这就是它的样子:

如果你仔细观察你会发现:

  1. 五个网络 ping(紧接在以
    PING redis
    开头的日志消息之后。这表明工作容器可以看到 Redis 容器。
  2. 成功的 Redis
    PING
    命令,服务器会使用
    PONG
    进行响应(在日志中也可见)。
© www.soinside.com 2019 - 2024. All rights reserved.