【问题标题】:Redis docker-compose with Nodejs - connect ENOENTRedis docker-compose 与 Nodejs - 连接 ENOENT
【发布时间】:2020-06-05 17:32:04
【问题描述】:

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

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 文件:

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

我得到的错误是:

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 桌面

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

const redisClient = redis.createClient({
  host: process.env.REDIS_HOST,
  port: parseInt(process.env.REDIS_PORT)
})
# 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 连接字符串的解决方案,请分享。

感谢您的帮助

【问题讨论】:

    标签: node.js docker redis docker-compose


    【解决方案1】:

    设置 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 文件:

    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
    

    【讨论】:

    • 感谢您的回复,尝试了您的解决方案,但仍然出现同样的错误Error: Redis connection to "redis://redis_db:6379" failed - connect ENOENT "redis://redis_db:6379",redis 日志* Ready to accept connections,操作系统是 macos 并使用 docker-desktop。
    • 您的代码是否尝试使用REDIS_URL 作为主机名? (设置 REDIS_URL=redis_db 是否有帮助,即使那不是 URL?)
    • 没有把它的url传给redis库,redis.createClient({ url: process.env.REDIS_URL })