我已经多次看到这个问题,但从未找到适合我的正确答案,所以我会尝试一下。
我已经在自己的 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"
}
});
但仍然没有喜悦。我感谢所有帮助
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 容器。这就是它的作用:
ping
从 Redis 容器中回显数据包。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!"
这就是它的样子:
如果你仔细观察你会发现:
PING redis
开头的日志消息之后。这表明工作容器可以看到 Redis 容器。PING
命令,服务器会使用 PONG
进行响应(在日志中也可见)。