не удалось подключиться к серверу: отказано в соединении для postresql из django с помощью docker - PullRequest
0 голосов
/ 03 января 2019

Я использую Django 2.x и настраиваю его с помощью Docker.

Я использую postresql ядро ​​базы данных.

Dockerfile содержимое

FROM python:3-alpine
RUN apk --update add libxml2-dev libxslt-dev libffi-dev gcc musl-dev libgcc curl
RUN apk add jpeg-dev zlib-dev freetype-dev lcms2-dev openjpeg-dev tiff-dev tk-dev tcl-dev postgresql-dev
RUN apk add --no-cache bash
ENV PYTHONUNBUFFERED 1
ENV LC_ALL C.UTF-8
ENV LANG C.UTF-8
RUN set -ex && mkdir /app
COPY Pipfile /app
COPY Pipfile.lock /app
WORKDIR /app
RUN pip install pipenv
RUN pipenv install --system --deploy
ADD . /app/
RUN chmod +x start.sh

# Expose port
EXPOSE 9010

docker-compose.yml файл содержит

version: '3'

services:
  nginx:
    image: nginx:alpine
    container_name: "originor-nginx"
    ports:
      - "10080:80"
      - "10443:43"
    volumes:
      - .:/app
      - ./config/nginx:/etc/nginx/conf.d
    depends_on:
      - web
    networks:
      - originor_web_network
  web:
    build: .
    container_name: "originor-web"
    command: ./start.sh
    volumes:
      - .:/app
    ports:
      - "9010:9010"
    depends_on:
      - db
    networks:
      - originor_web_network
      - originor_db_network
  db:
    image: postgres:11
    container_name: "originor-postgres-schema"
    volumes:
      - originor_database:/var/lib/postgresql/data
    networks:
      - originor_db_network
    environment:
      - POSTGRES_USER=originor_schema_u
      - POSTGRES_PASSWORD=ADF45sa98SD9q9we8r34&
      - POSTGRES_DB=originor_schema

networks:
  originor_web_network:
    driver: bridge
  originor_db_network:
    driver: bridge

volumes:
  originor_database:

и файл Django settings.py имеет

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'originor_schema',
        'USER': 'originor_schema_u',
        'PASSWORD': 'ADF45sa98SD9q9we8r34&',
        'HOST': 'db',
        'PORT': '5432',
    }
}

Но когда я бегу

docker-compose up

выдает ошибку как

originor-web | django.db.utils.OperationalError: could not connect to server: Connection refused
originor-web |  Is the server running on host "db" (172.23.0.2) and accepting
originor-web |  TCP/IP connections on port 5432?

Ответы [ 3 ]

0 голосов
/ 03 января 2019

Просто добавьте ports

db:
    image: postgres:11
    container_name: "originor-postgres-schema"
    volumes:
      - originor_database:/var/lib/postgresql/data
    networks:
      - originor_db_network
    environment:
      - POSTGRES_USER=originor_schema_u
      - POSTGRES_PASSWORD=ADF45sa98SD9q9we8r34&
      - POSTGRES_DB=originor_schema
    ports:
      - "15432:5432"
0 голосов
/ 03 января 2019

Я думаю, проблема в том, что ваш postresql не готов, когда ваш django ap пытается подключиться к нему. Docker compose всегда запускает и останавливает контейнеры в порядке следования или в последовательном порядке в файле, если не указан. Но docker-compose не гарантирует, что будет ждать запуска контейнера зависимостей. Вы можете сослаться на это здесь . Существует вероятность того, что ваше приложение может иногда работать, если база данных готова, когда приложение подключается к базе данных.

Однако при запуске Compose не ждет, пока контейнер будет «готов» (что бы это ни значило для вашего конкретного приложения) - только до его запуска. Для этого есть веская причина.

Таким образом, как рекомендуется для преодоления этих несоответствий, вы можете использовать wait-for-it.sh или аналогичный скрипт для переноса команды запуска приложения django. Вы можете изменить команду веб-контейнера на следующую после копирования приведенного выше сценария в корневой каталог проекта:

command: ["./wait-for-it.sh", "db:5432", "--", "./start.sh"]
0 голосов
/ 03 января 2019

Вы еще не настроили port в своем файле docker-compose.

ports:
    - "5432:5432"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...