Docker Compose,Django:角色“ _”不存在

时间:2019-01-14 01:58:06

标签: django postgresql docker docker-compose

上下文
我正在尝试使用docker-compose在docker开发环境中运行Django应用程序和Postgres数据库(这是我第一次使用Docker)。 我想将我的应用程序与一个自定义角色和一个名为teddycrepineau的数据库一起使用(而不是使用默认的postgres用户和db)。

目标
我的目标是部署一个Web应用程序,该Web应用程序通过react在前端运行,而后端通过django restapi在后端运行,整个运行在docker中。

系统/版本

  • python:3.7
  • django: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会创建角色和作为环境变量传递的数据库。

到目前为止我尝试过的事情
我在此站点,GitHub和docker上阅读了多种威胁:

  • 试图删除我的容器,并按照建议的here
  • 格式对其进行重建
  • 经历了this GitHub问题
  • 试图将环境变量从.env文件中的environment文件docker-compose.yml中移出,并重建容器

文件

docker-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

编辑

我的文件结构如下

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 :(得分:4)

发生这种情况是因为您的pgsql数据库是在没有任何环境的情况下启动的。 pgsql docker映像仅在您首次创建容器时使用env,此后将不会重新创建数据库和用户。

解决方案是删除pgsql卷,因此下次docker-compose up时,您将拥有一个读取了envs的新数据库。简单的方法是docker-compose down -v

答案 1 :(得分:1)

像这样更改您的环境订单。

POSTGRES_DB=teddycrepineau
POSTGRES_USER=teddycrepineau
POSTGRES_PASSWORD= 

我在this issue找到了它。我希望它能起作用。