上下文
我正在尝试使用docker-compose在docker开发环境中运行Django应用程序和Postgres数据库(这是我第一次使用Docker)。
我想将我的应用程序与一个自定义角色和一个名为teddycrepineau
的数据库一起使用(而不是使用默认的postgres用户和db)。
目标
我的目标是部署一个Web应用程序,该Web应用程序通过react在前端运行,而后端通过django restapi在后端运行,整个运行在docker中。
系统/版本
我遇到什么错误
使用自定义角色和数据库运行docker-compose up
时,出现以下错误django.db.utils.OperationalError: FATAL: role "teddycrepineau" does not exist
。当使用默认角色和db postgres
运行同一命令时,Django可以正常启动。
我的理解是,运行docker-compose up会创建角色和作为环境变量传递的数据库。
到目前为止我尝试过的事情
我在此站点,GitHub和docker上阅读了多种威胁:
.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
答案 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找到了它。我希望它能起作用。