Docker отказано в соединении между контейнерами - PullRequest
0 голосов
/ 27 марта 2020

Я использую Postgres, Redis и Node.js (добавление зависимостей с помощью пряжи) и пытаюсь интегрировать все это с файлом 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 -компоновался, у меня продолжают возникать проблемы с соединением с обеими базами данных :

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

1 Ответ

1 голос
/ 27 марта 2020

Ответ состоит из двух частей:

Во-первых, как указывал @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,
    }));
  }
...