django - Docker Compose,Django:角色“_”不存在
问题描述
上下文
我正在尝试使用 docker-compose 在 docker 开发环境中运行我的 Django 应用程序和 Postgres 数据库(这是我第一次使用 Docker)。我想将我的应用程序与自定义角色和数据库teddycrepineau
一起使用(而不是使用默认的 postgres 用户和数据库)。
目标
我的目标是部署一个 web 应用程序,前端由 react 供电,后端由 django restapi 供电,整个运行在 docker 中。
系统/版本
- 蟒蛇: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 将创建角色,并将 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
启动.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
解决方案
发生这种情况是因为您的 pgsql 数据库是在没有任何环境的情况下启动的。pgsql docker 映像仅在您第一次创建容器时使用环境,之后它不会重新创建数据库和用户。
解决方案是删除 pgsql 卷,这样下次docker-compose up
您将拥有一个读取 envs 的新数据库。简单的方法是docker-compose down -v
推荐阅读
- python - 使用 Chromedriver 的 Python SessionNotCreatedException
- unity3d - 统一的白色不是白色而是米色
- python - 多个 DataLoader Worker 是否可以访问 PyTorch 数据集?
- flutter - Flutter - 禁用底部导航栏动画(增长文本)
- windows - 如何使用密码和用户名作为进程参数登录 ORACLE?
- .net-core - Blazor WASM 中的 Microsoft Identity Web 无效令牌
- java - 无法在 IntelliJ 中将导入添加到 Java 类中
- node.js - MERN Stack 更快的 API 调用
- python - Python语法错误与for
- c++ - 降低圈复杂度