Подключите postgresql и используя виртуальную среду и docker в том же проекте - PullRequest
0 голосов
/ 28 января 2020

Я настраиваю проект локально для работы с docker и pipenv. В settings.py база данных изменилась

DATABASES = {
        'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': os.environ.get('POSTGRES_DB', default='postgres'),
        'USER': os.environ.get('POSTGRES_USER', default='postgres'),
        'PASSWORD': os.environ.get('POSTGRES_PASSWORD', default='postgres'),
        'HOST': os.environ.get('POSTGRES_HOST', default='localhost'),
        'PORT': "5432"
        }
}

и добавлена ​​в docker -compose.yml файл

version: '3.7'
services:
  web:
    build: .
    command: python /profi/manage.py runserver 0.0.0.0:8000
    environment:
      - SECRET_KEY=dy)zvq+sf07^^456t$$6+mv*tj6#5iwyo896-z!v=h^njl9^&@q
      - DEBUG=1
    volumes:
      - .:/profi
    ports:
      - 8000:8000
    depends_on:
      - db
  db:
    image: postgres:11
    volumes:
      - postgres_data:/var/lib/posgresql/data/
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
      POSTGRES_DB: postgres
      POSTGRES_HOST: db
    ports:
      - "5432:5432"


volumes:
  postgres_data:

Я хочу иметь возможность запускать проект локально двумя способами: через виртуальную среду и через docker. Но теперь у меня есть ошибка в обоих случаях

с использованием docker

db_1   | 
db_1   | 2020-01-28 09:03:18.408 UTC [1] LOG:  listening on IPv4 address "0.0.0.0", port 5432
db_1   | 2020-01-28 09:03:18.408 UTC [1] LOG:  listening on IPv6 address "::", port 5432
db_1   | 2020-01-28 09:03:18.425 UTC [1] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
db_1   | 2020-01-28 09:03:18.454 UTC [64] LOG:  database system was shut down at 2020-01-28 09:03:18 UTC
db_1   | 2020-01-28 09:03:18.462 UTC [1] LOG:  database system is ready to accept connections
....
web_1  |        Is the server running on host "localhost" (127.0.0.1) and accepting
web_1  |        TCP/IP connections on port 5432?
web_1  | could not connect to server: Cannot assign requested address
web_1  |        Is the server running on host "localhost" (::1) and accepting
web_1  |        TCP/IP connections on port 5432?

и с использованием ENV

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

Не могли бы вы помочь мне сделать правильную конфигурацию?

1 Ответ

1 голос
/ 28 января 2020

Вам необходимо добавить переменные окружения к вашему webapp. Таким образом, ваш docker -компонентный файл становится;

version: '3.7'
services:
  web:
    build: .
    command: python /profi/manage.py runserver 0.0.0.0:8000
    environment:
      DJANGO_SETTINGS_MODULE: "project.settings.development"
      DEBUG: 1
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
      POSTGRES_DB: postgres
      POSTGRES_HOST: db

    volumes:
      - .:/profi
    ports:
      - "${HTTP_PORT:-8000}:8000"
    depends_on:
      - db
  db:
    image: postgres:11
    volumes:
      - postgres_data:/var/lib/posgresql/data/
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
      POSTGRES_DB: postgres
      POSTGRES_HOST: db
    ports:
      - "${DB_PORT:-5432}:5432"


volumes:
  postgres_data:

Таким образом, ваша база данных будет настроена с нужными вам переменными среды, ваше веб-приложение будет иметь эти переменные среды, и вы уже получили django слушаю их. Поэтому django больше не будет прослушивать localhost для подключения к базе данных, он будет использовать db в качестве docker имени хоста для экземпляра postgres.

О, и не Передайте ваш секретный ключ как переменную среды, которая только добавляет потенциал для проблем безопасности. Установите DJANGO_SETTINGS_MODULE в качестве переменной среды, а затем django будет знать, где искать ваш секретный ключ и другие параметры.

Для запуска проекта в docker и в venv, или даже в нескольких В то же время вы можете использовать переменные окружения для HTTP_PORT и DB_PORT, чтобы порты на вашей машине могли отображаться в контейнер.

Например, вы можете запустить сервер postgres на вашем машина на порту 5432, а порт в контейнере db будет портом 5432. Установив свой файл compose, как указано выше, вы можете установить переменную окружения DB_PORT равной 54321, и она сможет работать рядом с вашим локальным хостом.

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