首页 > 解决方案 > Docker Compose,Django:角色“_”不存在

问题描述

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

目标
我的目标是部署一个 web 应用程序,前端由 react 供电,后端由 django restapi 供电,整个运行在 docker 中。

系统/版本

我遇到了什么错误
使用自定义角色和数据库 运行docker-compose up时,我收到以下错误django.db.utils.OperationalError: FATAL: role "teddycrepineau" does not exist。当使用默认角色和 db 运行相同的命令时,postgresDjango 能够正常启动。

我的理解是,运行 docker-compose up 将创建角色,并将 db 作为环境变量传递。

到目前为止
,我在此站点、GitHub 和 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

启动.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

标签: djangopostgresqldockerdocker-compose

解决方案


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

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


推荐阅读