【问题标题】:Docker connection refused between containers容器之间的 Docker 连接被拒绝
【发布时间】:2020-07-08 10:29:38
【问题描述】:

我正在使用 Postgres、Redis 和 Node.js(使用 yarn 添加依赖项),并尝试将它们与 docker-compose.yml 文件集成。

我有以下 docker-compose.yml:

version: '3'

services:
  postgres:
    image: postgres:latest
    restart: unless-stopped
    environment:
      - POSTGRES_DB=mybase
      - POSTGRES_USER=myuser
      - POSTGRES_PASSWORD=mypass

  redis:
    image: redis:latest
    restart: unless-stopped

  migrate:
    build: .
    entrypoint: node_modules/.bin/sequelize db:migrate --config src/config/database.js --migrations-path src/database/migrations/
    volumes:
      - ./:/app
      - /app/node_modules
    depends_on:
      - postgres

  wavetech-be:
    build:
      dockerfile: Dockerfile
      context: .
    restart: on-failure
    volumes:
      - /app/node_modules
      - ./:/app
    environment: 
      - REDIS_HOST=redis
      - REDIS_PORT=6379
      - DB_HOST=postgres
      - DB_USER=myuser
      - DB_PASS=mypass
      - DB_PORT=5432
      - DB_NAME=mybase
    depends_on:
      - redis 
      - migrate

还有以下 Dockerfile:

FROM node:alpine

WORKDIR "/app"

COPY ./package.json ./
RUN apk add yarn
RUN yarn

COPY . .

CMD [ "yarn", "dev" ]

但是,当我 docker-compose up 时,我不断遇到两个数据库的连接问题:

migrate_1      | 
migrate_1      | ERROR: connect ECONNREFUSED 127.0.0.1:5432
migrate_1      | 
...
wavetech-be_1  | (node:85) UnhandledPromiseRejectionWarning: Error: connect ECONNREFUSED 127.0.0.1:6379

【问题讨论】:

  • 您似乎没有告诉migrate 在哪里可以找到数据库。比较您为 wavetech-be 设置的环境,它实际上告诉它在哪里查找。
  • 真的!太感谢了!您为迁移做好了准备!这是一个问题。不过,对 redis 服务有什么想法吗?
  • 它似乎没有使用REDIS_HOST,它仍在尝试连接127.0.0.1
  • @jonrsharpe 我设法找出问题所在:我将 Bull 与我的 Redis 服务器一起使用,即使我通过 redisConfig 导入传递 process.env 变量,它也只能正常工作当我将 process.env 变量直接传递到 Bull 的配置中时。你帮了我很多,伙计。如果你想添加一个正式的答案,我很乐意接受!非常感谢!
  • 卢卡斯,如果您找到答案,请使用下面的“发布您的答案”按钮。在这里完全感谢您回答您自己的问题。我们会将这个问题从未回答的问题列表中删除。

标签: postgresql docker redis docker-compose dockerfile


【解决方案1】:

答案分为两部分:

首先,正如@jonrsharpe 所指出的,迁移服务的描述缺少环境 变量。因此,与卷一样,每个服务都需要配置自己的环境变量。

  migrate:
    build: .
    entrypoint: node_modules/.bin/sequelize db:migrate --config src/config/database.js --migrations-path src/database/migrations/
    volumes:
      - ./:/app
      - /app/node_modules
    environment:
      - DB_HOST=postgres
      - DB_USER=myuser
      - DB_PASS=mypass
      - DB_PORT=5432
      - DB_NAME=mybase
      - APP_PORT=3000
    depends_on:
      - postgres

其次,我正在使用 Bull 来管理我的 Redis 服务器。我正在导入一个配置并将其直接传递给 Redis,所以:

import redisConfig from '../../config/redis';
...
  init() {
    this.queues = Object.values(jobs).map(job => ({
      bull: new BullQueue(job.key, redisConfig),
      name: job.key,
      handle: job.handle,
    }));
  }

事实证明,Bull 只是尝试使用默认的 Redis 配置。当我将环境变量直接传递到 Bull 配置中时,它可以正常工作:

  init() {
    this.queues = Object.values(jobs).map(job => ({
      bull: new BullQueue(job.key, {
        redis: {
          host: process.env.REDIS_HOST,
          port: process.env.REDIS_PORT,
        },
      }),
      name: job.key,
      handle: job.handle,
    }));
  }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-20
    • 2017-05-09
    • 1970-01-01
    • 2021-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-10
    相关资源
    最近更新 更多