Проблемы с Docker Compose: конфигурация на уровень выше не работает

Я работаю над проектом, который использует Docker для развертывания бэкенда на Node.js и базы данных PostgreSQL. У меня есть файл docker-compose.yml, который я использую для запуска этих сервисов.

Когда я размещаю файл docker-compose.yml на уровень ниже в структуре папок, все работает корректно. Однако, когда я перемещаю его на уровень выше, я сталкиваюсь с проблемами.

Вот рабочая конфигурация, когда файл docker-compose.yml находится на уровень ниже:

version: '3'

services:
  pg:
    image: postgres:latest
    environment:
      POSTGRES_DB: postgres2
      POSTGRES_USER: name1
      POSTGRES_PASSWORD: pass
      PGDATA: /var/lib/postgresql/data/pgdata
    ports:
      - "5433:5432"
    volumes:
      - db-data:/var/lib/postgresql/data/pgdata

  backend:
    build:
      context: .
      dockerfile: DockerFile
    ports:
      - "3000:3000"
    environment:
      - NODE_ENV=development
      - DB_HOST=pg
      - DB_USER=name1
      - DB_PASS=pass
      - DB_NAME=postgres2
    depends_on:
      - pg

volumes:
  db-data:

Вот конфигурация, когда файл docker-compose.yml находится на уровень выше:

version: '3'

services:
  pg:
    image: postgres:latest
    environment:
      POSTGRES_DB: postgres2
      POSTGRES_USER: name1
      POSTGRES_PASSWORD: pass
      PGDATA: /var/lib/postgresql/data/pgdata
    ports:
      - "5433:5432"
    volumes:
      - db-data:/var/lib/postgresql/data/pgdata

  backend:
    build:
      context: ./backend
      dockerfile: DockerFile
    ports:
      - "3000:3000"
    environment:
      - NODE_ENV=development
      - DB_HOST=pg
      - DB_USER=name1
      - DB_PASS=pass
      - DB_NAME=postgres2
    depends_on:
      - pg

volumes:
  db-data:

Какие изменения нужно внести в конфигурацию, чтобы она работала на уровень выше? Мой сервер запускается,но если через postman обратиться например к articles,то "message": "relation \"Articles\" does not exist.Если docker-compose все же находится в одной директории с моим проектом,то мне возвращается json с ожидаемыми данными


Ответы (1 шт):

Автор решения: Pak Uula

Что говорит ошибка relation \"Articles\" does not exist? Она говорит, что в одном проекте таблица Articles есть, а в другом нет. Причина в том, что при запуске из разных мест создаются разные db-data. При запуске docker compose создаёт именованные volume. К имени тома прибавляется имя проекта (по умолчанию это имя каталога)

Вот пример:

  1. запускаю docker compose в каталоге ~/tmp/down, затем выполняю docker volume ls: создан том с именем down_db-data.

  2. запускаю тот же компоуз в каталоге ~/tmp. Создаётся том tmp_db-data.

Чтобы таких приколов не было, я всегда явным образом монтирую в контейнеры каталоги из хоста, а не абстрактные volumes.

Если вы хотите использовать один том в нескольких проектах, то вам следует дать тому глобальное имя и указать его в docker-compose.yaml:

volumes:
  db-data:
    external: true
    name: actual-name-of-volume
→ Ссылка