Docker -композит: Postgresql ECONNREFUSED - PullRequest
       14

Docker -композит: Postgresql ECONNREFUSED

0 голосов
/ 23 февраля 2020

Сегодня я пытаюсь докернизировать полное приложение (веб-интерфейс, API и базу данных), чтобы развернуть его на локальной машине и / или на виртуальной машине.

При выполнении:

docker-compose up

Я получил «Connect ECONNREFUSED», когда я пытаюсь запустить свой API, который будет подключаться к базе данных (он использует Sequelize под капотом) со следующей переменной env:

DATABASE_URL: "postgresql://${POSTGRES_USER:-postgres}:${POSTGRES_PASSWORD:-jy95}@db:5432/${POSTGRES_DB:-sourcecode}"

In docker docs , сказано:

Теперь каждый контейнер может искать имя хоста web или db и возвращать IP-адрес соответствующего контейнера. Например, код веб-приложения может подключиться к URL postgres: // db: 5432 и начать использовать базу данных Postgres.

In PostgreSQL docs , мы видим, что postgresql: // также действителен:

The URI scheme designator can be either postgresql:// or postgres://. Each of the URI parts is optional.

Вот мой полный docker -compose.yml файл:

version: '3.7'
services:
  frontend:
    image: jy95/sourcecode-front
    restart: always
    depends_on:
      - api
    ports:
      - "80:3000"
      - "443:3000"
    environment:
      API_SERVER: "api:8080"
      CDN_SERVER: "api:8080/files"
  api:
    image: jy95/sourcecode_api
    restart: always
    ports:
      - "8080:3000"
    depends_on:
      - db
    environment:
      DATABASE_URL: "postgresql://${POSTGRES_USER:-postgres}:${POSTGRES_PASSWORD:-jy95}@db:5432/${POSTGRES_DB:-sourcecode}"
      # use a env file if you want to use other values that default ones
      # https://docs.docker.com/compose/environment-variables/#the-env_file-configuration-option
  db:
    image: postgres:12-alpine
    restart: always
    ports:
      - "5432:5432"
    environment:
      # use a env file for that part later
      # https://docs.docker.com/compose/environment-variables/#the-env_file-configuration-option
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: jy95
      POSTGRES_DB: sourcecode
      POSTGRES_PORT: 5432
      # If we want to access more easily to the database (not recommended)
      # PGDATA: /var/lib/postgresql/data/pg_data
    #volumes:
    #  - pg_data:/var/lib/postgresql/data/pg_data

Заранее спасибо за помощь

PS: изображения уже на Docker Hub

1 Ответ

1 голос
/ 23 февраля 2020

Ваш комментарий на самом деле является большой подсказкой: «Это команда, которую я использовал (как я вижу, я использовал« зависящий_он », чтобы убедиться, что база данных требуется перед API). Ошибка: SequelizeConnectionRefusedError: connect ECONNREFUSED 127.0 .0.1: 5432 Чего я не понимаю: документы docker не обновлены? "

Похоже, ваш контейнер API пытается выстрелить в localhost вместо db: 5432 (как вы указал, что db - это DNS-имя, и маловероятно, что оно преобразуется в 127.0.0.1 (IP зарезервирован для localhost)

Быстрая отладка: run: docker exe c -it sh (в контейнер) apk добавить busybox-extras, а затем: te lnet 127.0.0.1 5432 -> вы увидите, что это недостижимо, однако te lnet db 5432 -> это прекрасно, кроме того, вы можете запустить nslookup db -> как мы уже установили, это имя DNS (db) должно быть разрешено

Я попытался добавить network_mode: host к api (в docker -compose.yml), но это заставляет ваше приложение создавать sh. На данный момент я Я рекомендую просмотреть код для API и найти любые ссылки на 127.0.0.1:5432 Если вы запустите docker exe c -it sh и затем: printenv Вы увидите, что переменная среды DB_URL установлена ​​в: postgresql: // postgres:jy95@db: 5432 / sourcecode, но вы уверены, что этот ENV-VAR используется API? (возможно Вы прокомментировали некоторый код в качестве примера, и Вы все еще используете другую строку подключения)

...