Почему не работает мой docker контейнер на heroku?(nest js + postgrse)
Всем привет. Пытаюсь развернуть свой сервер + бд на heroku. С докером работаю впервые, на heroku деплою второй раз) Поэтому, все что я делал - копировал со всяких видео без особого понимая происходящего. Я, вроде как, смог создать контейнер, который даже запускается и работает. Потом пытался задеплоить его на heroku. Для этого выполнил следующие команды: heroku container:push web --app cp-itr | heroku container:release web --app cp-itr. Попробовал сделать запрос - ошибка. Открываю логи, а там пишет, что не может подключится к бд. Проект, если что, на nest js + postgres. Приведу примеры моих докер файлов + .env . Надеюсь, этого хватит.
PORT=5000
POSTGRES_HOST=postgres
POSTGRES_USER=postgres
POSTGRES_DB=cp_itr
POSTGRES_PASSWORD=112233
POSTGRES_PORT=5432
GOOGLE_CLIENT_ID=845439658659-unvuvrvv6vcoruij9nl3ia6ks6b6pu01.apps.googleusercontent.com
GOOGLE_SECRET=112233
GOOGLE_REDIRECT_URI=https://cp-itr.herokuapp.com/web/auth/google/redirect
SECRET=SECRET3
Dockerfile
FROM node:12.13-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
COPY ./dist ./dist
CMD ["npm", "run", "start:dev"]
docker-compose.yml
version: '3.0'
services:
main:
container_name: main
build:
context: .
env_file:
- .development.env
volumes:
- .:/app
- /app/node_modules
ports:
- 5000:5000
- 9229:9229
command: npm run start:dev
depends_on:
- postgres
restart: always
postgres:
container_name: postgres
image: postgres:13
env_file:
- .development.env
environment:
PG_DATA: /var/lib/postgresql/data
ports:
- 5432:5432
volumes:
- pgdata:/var/lib/postgresql/data
restart: always
volumes:
pgdata:
Ответы (2 шт):
По описанию выглядит так, что вы просто пытаетесь запустить образ вашего приложения без базы, т.к. локально вы её запускаете вместе с приложением в docker-compose, но удаленно на heroku грузите и запускаете только образ с приложением, поэтому оно и не может подключиться к базе.
У heroku есть возможность добавить Postgres базу данных к вашему приложению (у бесплатной базы есть ограничения, но для тестового приложения должно хватать). Resource -> Add-ons -> введите Heroku Postgres. После того как вы добавите базу в ваше приложение, вы сможете посмотреть настройки по которым к ней можно будет подключаться (они же появятся как DATABASE_URL в переменных окружения). Вам нужно будет сделать чтобы ваше приложение считывало эти настройки из env vars или просто захардкодить их, временно.
Попробуйте не объединять все в один контейнер, а использовать контейнерную сеть, для этого нужно создать сеть:
docker network create resources
При этом мы не указываем драйвер сети, так как по умолчанию создаются сети с типом bridge, которые связывают изолированные контейнеры между собой.
Прописать к каждому контейнеру
networks:
- resources
и изменить приложение, что бы обращение шло не на localhost:5432, а по на имя контейнера, к примеру:
container_name: postgres
Обращаться нужно будет на адрес postgres:5432 для этого отдельно пробрасывать порты не нужно.
Плюс данной системы связи приложение <-> БД в том, что не нужно для каждого проекта отдельно поднимать БД. Просто добавлять нужные базы.