Почему мое приложение Django не смогло подключиться к postgres внутри docker

#django #postgresql #docker #docker-compose

#django #postgresql #docker #docker-compose

Вопрос:

Я пытаюсь запустить свое приложение django внутри контейнера docker

docker-compose.yml

 version: '3.8'

services:
  api:
    build:
      context: .
      dockerfile: ./Dockerfile-local
    ports:
      - "8000:8000"
    entrypoint: ./entrypoint-local.sh
    env_file:
      - .env-local
    links:
      - postgresql
  postgresql:
    image: postgres:12.4
    restart: always
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_DB=frov_db
      - POSTGRES_PASSWORD=postgres
      - POSTGRES_HOST=postgresql
      - POSTGRES_PORT=5432
      - PGDATA=/var/lib/postgresql/data/pgdata
      - C_FORCE_ROOT=true
    ports:
      - '5433:5432'
  

Dockerfile-local

 FROM python:3.8-slim

ENV PYTHONDONTWRITEBYTECODE 1

WORKDIR /usr/src/app

COPY Pipfile.lock Pipfile ./
RUN pip install -U setuptools pip pipenv amp;amp; pipenv install --system --deploy --ignore-pipfile --dev

COPY . .

RUN touch /var/log/filebeat.log amp;amp; chmod 664 /var/log/filebeat.log 
amp;amp; chmod  x ./entrypoint-local.sh
  

entrypoint-local.sh

 #!/bin/bash

python manage.py collectstatic --no-input --settings frov.settings.default

python manage.py migrate --settings frov.settings.default
python manage.py seed

gunicorn -b 0.0.0.0:8000 --workers=1 --env DJANGO_SETTINGS_MODULE=frov.settings.default frov.wsgi:application
  

.env-local

 DEBUG=True
DJANGO_SETTINGS_MODULE=frov.settings.default
DB_NAME=frov_db
DB_USER=postgres
DB_PASS=postgres
DB_HOST=postgresql
DB_PORT=5433
  

И теперь у меня есть идея, почему я получаю такую ошибку

 api_1         | psycopg2.OperationalError: could not connect to server: Connection refused
api_1         |     Is the server running on host "postgresql" (172.21.0.2) and accepting
api_1         |     TCP/IP connections on port 5433?
  

Кто-нибудь может мне помочь? Я просто не могу понять, где может произойти ошибка

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

1. 5433 открыт ли порт для хоста. Внутри сети docker postgres по-прежнему доступен postgresql:5432 , поэтому попробуйте переключить порт в env на 5432

2. @awesoon — о, да, вы правы. Если вы хотите, вы можете опубликовать ответ, и я его приму

3. @Stefano 5432 — это порт контейнера, открытый как 5433 порт хоста. Однако даже документы ссылаются на 5433 порт как the publicly exposed port . Поэтому я прошу прощения за путаницу, но я не думаю, что я здесь ошибаюсь.

4. вы правы. Я прошу прощения.

Ответ №1:

Этот ports раздел конфигурации:

 ports:
  - '5433:5432'
  

Предоставляет 5432 порт контейнера 5433 для порта хоста. Однако в сети docker БД по-прежнему доступна через 5432 порт, поэтому вам нужно изменить свой .env файл, чтобы использовать 5432 порт.

Если вам не нужны другие приложения для доступа к БД с хоста, вы можете вообще пропустить этот ports раздел (вы все равно сможете подключиться к нему, используя, например docker-compose exec )