【问题标题】:Docker Compose, Django: role "_" does not existDocker Compose,Django:角色“_”不存在
【发布时间】:2019-06-08 01:17:33
【问题描述】:

上下文
我正在尝试使用 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 上阅读了多个威胁:

  • 试图删除我的容器并按照here建议的格式重建它
  • 通过thisGitHub问题
  • 试图将我的环境变量从.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 时无法访问我的网站,但这主要是一个不同的问题)和自定义用户和D b。当我将 docker-compose.yml 文件放到我的根文件夹时,我收到错误 django.db.utils.OperationalError: FATAL: role "teddycrepineau" does not exist

【问题讨论】:

  • 输入错误POSTGES_USER=teddycrepineau => POSTGRES_USER=teddycrepineau.
  • 感谢您指出这一点,但我仍然遇到同样的问题。

标签: django postgresql docker docker-compose


【解决方案1】:

像这样改变你的环境顺序。

POSTGRES_DB=teddycrepineau
POSTGRES_USER=teddycrepineau
POSTGRES_PASSWORD= 

我在this issue 找到它。我希望它有效。

【讨论】:

  • 不幸的是,它不起作用。虽然我发布了一个编辑
【解决方案2】:

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

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

【讨论】:

  • 这是正确答案。 OP 说他重新创建了容器,但由于volumes 条目,实际的表和数据不在容器中。重新创建容器不会擦除现有的数据库和表,您需要擦除“postgres_data”中的所有内容。
  • ...docker-compose down 是否真的删除了通过volumes 映射到容器中的本地文件?
  • @TimTisdall 感谢提醒我...默认情况下docker-compose down 不会删除命名卷,因此需要-v
  • 这真的会删除本地文件吗?我使用volumes 将我的代码库映射到一个实例中,如果该命令实际上删除了与卷映射的所有内容,这似乎很糟糕。例如,他有“。”映射到一个卷,所以该命令不会删除 docker-compose.yml 吗?!
  • 是的,就是这样。谢谢你。我第一次运行 docker-compose up 时没有 .env 文件但有一个命名卷。即使我正在运行 docker-compose downdocker system prunedocker-compose build,它也永远不会删除和重建我的卷。
【解决方案3】:

当你运行时

sudo docker-compose exec web python manage.py migrate 

是的,你当然会收到

“django.db.utils.OperationalError: FATAL: 角色“用户”不存在

首先你需要放

sudo docker-compose down -v
sudo docker system prune

检查容器,它们应该被删除

sudo docker ps -a

然后检查图像

sudo docker image ls 

别忘了删除图片

sudo docker image rm 3e57319a7a3a 

运行到项目文件夹然后签出

python manage.py migrate 

如果它不起作用,请放置

python manage.py migrate —run-syncdb

sudo docker-compose up -d --build

sudo  docker-compose exec web python manage.py collectstatic --no-input

sudo docker-compose exec web python manage.py makemigrations
sudo docker-compose exec web python manage.py migrate auth
sudo docker-compose exec web python manage.py migrate --run-syncdb

【讨论】:

    【解决方案4】:

    由于$POSTGRES_DB$POSTGRES_USER 变量不匹配,我遇到了这个问题。默认情况下,psql 将尝试将数据库设置为与登录用户相同的名称,因此当变量之间存在不匹配时,它会失败并出现类似 psql 的错误:

    致命:数据库“根”不存在

    我必须编辑我正在编写的初始化脚本以包含 -d "$POSTGRES_DB" 选项,如下所示:

    #!/bin/bash
    set -e
    
    psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" -d "$POSTGRES_DB" <<-EOSQL
            CREATE USER docker;
            CREATE DATABASE docker;
            GRANT ALL PRIVILEGES ON DATABASE docker TO docker;
    
    EOSQL
    

    【讨论】:

      猜你喜欢
      • 2021-10-11
      • 1970-01-01
      • 2017-04-16
      • 2016-09-17
      • 1970-01-01
      • 2021-11-13
      • 2018-09-18
      • 1970-01-01
      • 2021-08-22
      相关资源
      最近更新 更多