Как мне подключиться к производственной базе данных из контейнера Docker?

#docker

#docker

Вопрос:

Я пытаюсь настроить node.js приложение, которое ранее работало на Heroku с дополнением postgres в качестве производственной базы данных. Не удается подключиться к базе данных из контейнера.

Файл Docker

FROM node:8
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 8080
CMD ["npm","start"]

Файл Docker Compose

version: '3'
services:
web:
build: .
ports:
- "5000:5000"
- "5432:5432"
env_file: .env
extra_hosts:
- "iondev:172.27.27.59"

Ошибка
web_1 | {"level":30,"time":1553864230376,"msg":"Narrafy listening on port 5000","pid":16,"hostname":"961f47819c3e","v":1}
web_1 | {"level":50,"time":1553864230399,"msg":"Failed to connect to DB.","pid":16,"hostname":"961f47819c3e","v":1}
web_1 | {"level":50,"time":1553864230399,"msg":"Connection terminated unexpectedly","pid":16,"hostname":"961f47819c3e","type":"Error","stack":"Error: Connection terminated unexpectedlyn at Connection.con.once (/usr/src/app/node_modules/pg/lib/client.js:200:9)n at Object.onceWrapper (events.js:313:30)n at emitNone (events.js:106:13)n at Connection.emit (events.js:208:7)n at Socket.<anonymous> (/usr/src/app/node_modules/pg/lib/connection.js:130:10)n at emitNone (events.js:111:20)n at Socket.emit (events.js:208:7)n at endReadableNT (_stream_readable.js:1064:12)n at _combinedTickCallback (internal/process/next_tick.js:139:11)n at process._tickCallback (internal/process/next_tick.js:181:9)","v":1}

Комментарии:

1. Можете ли вы поделиться сообщением об ошибке, которое вы получаете из своего приложения Node, и вашим файлом Dockerfile (без секретов)?

2. Установите оболочку в свой контейнер docker run -it --entrypoint=bash <imagename> и попробуйте а) проверить, доступен ли целевой хост / порт изнутри контейнера: nc -zv -w 2 <db-host> 3306 б) попробуйте подключиться к нему вручную; mysql -u <username> -p<password> -p <databasename> ; вам понадобятся соответствующие инструменты на контейнере

Ответ №1:

Без dockerfile невозможно отладить эту проблему. Скорее всего, проверьте свои учетные данные DB и убедитесь, что вы передаете их как переменную ENV.

Вы можете проверить журналы, используя docker logs <идентификатор контейнера>.

Или используйте команду docker exec для проверки переменных среды.

Комментарии:

1. В моем файле .env: у меня есть что-то вроде DATABASE_URL=postgresql://172.27.27.59:5432/postgres