Проблемы с 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 шт):
Что говорит ошибка relation \"Articles\" does not exist
? Она говорит, что в одном проекте таблица Articles есть, а в другом нет. Причина в том, что при запуске из разных мест создаются разные db-data. При запуске docker compose создаёт именованные volume
. К имени тома прибавляется имя проекта (по умолчанию это имя каталога)
Вот пример:
запускаю docker compose в каталоге
~/tmp/down
, затем выполняюdocker volume ls
: создан том с именемdown_db-data
.запускаю тот же компоуз в каталоге
~/tmp
. Создаётся томtmp_db-data
.
Чтобы таких приколов не было, я всегда явным образом монтирую в контейнеры каталоги из хоста, а не абстрактные volumes
.
Если вы хотите использовать один том в нескольких проектах, то вам следует дать тому глобальное имя и указать его в docker-compose.yaml
:
volumes:
db-data:
external: true
name: actual-name-of-volume