Docker Compose, Django: роль "_" не существует - PullRequest
0 голосов
/ 14 января 2019

Context
Я пытаюсь запустить свое приложение Django и базу данных Postgres в среде разработки docker, используя docker-compose (я впервые использую Docker). Я хочу использовать свое приложение с пользовательской ролью и базой данных с именем teddycrepineau (в отличие от использования пользователя postgres по умолчанию и базы данных).

Цель
Моя цель состоит в том, чтобы развернуть веб-приложение, работающее на внешнем интерфейсе с помощью response и backend от django restapi, все это работает в докере.

Система / Версия

  • питон: 3,7
  • Джанго: 2,1
  • ОС: Mac OS High Sierra

Какую ошибку я получаю
При запуске docker-compose up с моей пользовательской ролью и базой данных я получаю следующую ошибку django.db.utils.OperationalError: FATAL: role "teddycrepineau" does not exist. При запуске той же команды с ролью по умолчанию и db postgres Django может нормально запускаться.

Насколько я понимаю, запуск docker-compose up создаст роль, а db будет передана как переменная среды

То, что я пробовал до сих пор
Я прочитал несколько угроз на этом сайте, GitHub и Docker:

  • попытался удалить мой контейнер и перестроить его с форматированием, как предлагалось здесь
  • Прошел через этот выпуск GitHub
  • Попытался переместить мою переменную окружения из .env файла environment в мой docker-compose.yml файл и перестроить мой контейнер

Файлы

докер-compose.yml

version: '3'

volumes:
  postgres_data: {}

services:
  postgres:
    image: postgres
    volumes: 
      - postgres_data:/var/lib/postgresql/data
    env_file: .env
    ports:
      - "5432"

  django:
    build:
      context: teddycrepineau-backend
      dockerfile: teddycrepineau-root/Dockerfile
    command: ./teddycrepineau-backend/teddycrepineau-root/start.sh
    env_file: .env
    volumes: 
      - .:/teddycrepineau-backend
    ports:
      - "8000:8000"
    depends_on: 
      - postgres

Dockerfile

FROM python:3.7

ENV PYTHONUNBUFFERED 1

WORKDIR /teddycrepineau-backend/
ADD ./teddycrepineau-root/requirements.txt /teddycrepineau-backend/
RUN pip install -r requirements.txt
ADD . /teddycrepineau-backend/
RUN chmod +x ./teddycrepineau-root/start.sh

start.sh

#!/usr/bin/env bash
python3 ./teddycrepineau-backend/teddycrepineau-root/manage.py runserver

.env

POSTGRES_PASSWORD= 
POSTGRES_USER=teddycrepineau
POSTGRES_DB=teddycrepineau

EDIT

Моя файловая структура выглядит следующим образом

root
 |___ teddycrepineau-backend
        |___ teddycrepineau-root
               |___ teddycrepineau
               |___ Dockerfile
               |___ manage.py
               |___ start.sh
 |___ teddycrepineau-frontend
        |___ React-App

 |___ .env
 |___ docker-compose.yml

Когда я перемещаю свой файл docker-compose.yml в свою внутреннюю папку, он запускается, как и ожидалось (хотя я не могу получить доступ к своему сайту при переходе на 127.0.0.1:8000, но это в основном другая проблема) с пользовательским пользователем и дб. Когда я помещаю свой docker-compose.yml файл в свою корневую папку, я получаю ошибку django.db.utils.OperationalError: FATAL: role "teddycrepineau" does not exist

Ответы [ 2 ]

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

Это происходит потому, что ваша база данных pgsql была запущена без envs. Образ dogs pgsql использует envs только в первый раз, когда вы создали контейнер, после чего он не будет воссоздавать БД и пользователей.

Решение состоит в том, чтобы удалить том pgsql, поэтому в следующий раз, когда вы docker-compose up будете иметь новый db с чтением envs. Простой способ сделать это - docker-compose down -v

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

Измените свой порядок в env следующим образом.

POSTGRES_DB=teddycrepineau
POSTGRES_USER=teddycrepineau
POSTGRES_PASSWORD= 

Я нахожу это в этом выпуске . Я надеюсь, что это работает.

...