为什么我的Django应用程序无法连接到docker内部的postgres

时间:2020-11-01 09:11:53

标签: django postgresql docker docker-compose

我正在尝试在Docker容器中启动django应用程序

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

FROM python:3.8-slim

ENV PYTHONDONTWRITEBYTECODE 1

WORKDIR /usr/src/app

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

COPY . .

RUN touch /var/log/filebeat.log && chmod 664 /var/log/filebeat.log \
&& 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 个答案:

答案 0 :(得分:1)

ports config section

ports:
  - '5433:5432'

5432容器端口暴露于5433主机端口。但是,在docker网络中,仍可以通过5432端口访问数据库,因此您需要更改.env文件以使用5432端口。

如果您不需要其他应用程序即可从主机访问数据库,则可以完全忽略此ports部分(您仍然可以使用docker-compose exec连接到该部分)