首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Redis docker-与Nodejs - connect ENOENT组合

Redis docker-与Nodejs - connect ENOENT组合
EN

Stack Overflow用户
提问于 2020-06-05 02:28:14
回答 1查看 1.2K关注 0票数 0

我正在尝试使用docker-compose将我的整个开发人员工作流程容器化。我面临的问题是redis contianer。我的worker容器无法连接到redis。我尝试了与stackoverflow不同的解决方案,比如:

Setting up node with redis using docker-compose

Access redis locally on docker - docker compose

nodejs, redis, npm and docker-compose setup

Docker-compose , anyway to specify a redis.conf file?

How to connect to a Redis container using Docker Compose?

还有许多来自github的其他人,他们尝试了不同的例子,但没有成功。

这是我的docker-compose文件:

代码语言:javascript
运行
复制
version: "3.6"

services:
  redis_db:
    # image: bitnami/redis:latest # tried different image also
    image: redis
    container_name: rme_redis
    network_mode: host # tried networks also
    # command: ['redis-server', '/redis.conf']
    # volumes:
    #   - ./docker/redis.conf:/redis.conf
    # hostname: redis_db
    # networks: 
    #   - rme
    # environment:
    #   - ALLOW_EMPTY_PASSWORD=yes
      # - REDIS_PASSWORD="redis"
    ports:
      - 6379:6379
    # networks:
    #   node_net:
    #     ipv4_address: 172.28.1.4

  worker:
    build: worker
    image: worker
    container_name: rme_worker
    command: node worker.js
    # networks:
    #   - rme
    # network_mode: host
    environment: 
      - REDIS_URL="redis://redis_db:6379" # localhost when netowk_mode is host
    volumes:
      - ./worker:/app
    # links:
    #   - redis_db
    depends_on:
      - redis_db

我得到的错误是:

代码语言:javascript
运行
复制
Error: Redis connection to "redis://redis_db:6379" failed - connect ENOENT "redis://redis_db:6379"
     at PipeConnectWrap.afterConnect [as oncomplete] (net.js:1141:16) {
   errno: -2,
   code: 'ENOENT',
   syscall: 'connect',
   address: '"redis://redis_db:6379"'
 }

操作系统: macOS

Docker: Docker Desktop

编辑:找到了在js代码中使用主机和端口的解决方案

代码语言:javascript
运行
复制
const redisClient = redis.createClient({
  host: process.env.REDIS_HOST,
  port: parseInt(process.env.REDIS_PORT)
})
代码语言:javascript
运行
复制
# docker-compose.yml
version: "3.6"
services:
  redis_db:
    image: redis
    # only needed to directly access Redis from host
    ports:
      - 6379:6379
  worker:
    build: worker
    environment: 
      - REDIS_HOST=redis_db
      - REDIS_PORT=6379
    depends_on:
      - redis_db

如果你找到了使用redis连接字符串的解决方案,请分享。

谢谢你的帮忙

EN

回答 1

Stack Overflow用户

发布于 2020-06-05 02:42:59

设置network_mode: host会关闭特定容器的Docker网络。只有在一些不寻常的情况下,容器不会侦听固定的端口号,或者您试图使用容器来管理主机的网络设置时,才需要这样做。

在您的示例中,由于Redis数据库正在禁用Docker网络,因此应用程序容器无法通过名称访问它。删除所有的network_mode: host选项应该可以解决这个问题。

Networking in Compose描述了整个网络设置。值得注意的是,Compose将为您创建一个default网络,并且容器将可以使用它们的Compose服务名进行访问。通常,您不应该需要指定自定义networks:选项、显式提供container_name:、设置hostname:、提供古老的links:或设置network_mode:

您应该能够成功地将显示的docker-compose.yml文件裁剪为:

代码语言:javascript
运行
复制
version: "3.6"
services:
  redis_db:
    image: redis
    # only needed to directly access Redis from host
    ports:
      - 6379:6379
  worker:
    build: worker
    environment: 
      - REDIS_URL="redis://redis_db:6379"
    # `docker-compose up worker` also starts Redis
    # Not strictly needed for networking
    depends_on:
      - redis_db
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62201716

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档