Docker 无法识别 .env postgres 变量

时间:2021-07-12 18:08:37

标签: python django postgresql docker

编辑:Docker 似乎没有创建我的 postgres 数据库,即使我在 .env 文件中定义了它们。

我使用了 docker-compose config,看起来 Docker 确认了我的数据:

environment:
    POSTGRES_DB: animemusicsorter
    POSTGRES_PASSWORD: root
    POSTGRES_USER: waifuszn

但是当我运行 docker-compose up 时,会出现以下错误:

postgres    | 2021-07-12 22:39:01.906 UTC [35] FATAL:  password authentication failed for user "waifuszn"
postgres    | 2021-07-12 22:39:01.906 UTC [35] DETAIL:  Role "waifuszn" does not exist.

我已尝试删除卷并删除 postgres 并重新创建它们,但这也没有给我任何结果。

docker-compose.yml

version: '3.5'

services:
  postgres:
    container_name: postgres
    image: postgres:11.6
    ports:
      - "5432:5432"
    environment:
      POSTGRES_PASSWORD: ${DB_PASSWORD}
      POSTGRES_DB: ${DB_NAME}
      POSTGRES_USER: ${DB_USER}
    volumes:
      - ~/srv/docker/template-postgres/data:/var/lib/postgresql/data:rw

  django:
    container_name: django
    build:
      context: .
      dockerfile: ./conf/django/Dockerfile.windows
    command: python manage.py runserver 0.0.0.0:8000
    ports:
      - "8000:8000"
    volumes:
      - ./back:/app:rw
    depends_on:
      - postgres
    env_file:
      - .env

  react:
    container_name: react
    build:
      context: .
      dockerfile: ./conf/react/Dockerfile
    command: yarn run start:dev
    ports:
      - "4000:4000"
    volumes:
      - ./front/src:/app/src:rw
      - ./front/public:/app/public:rw

3 个答案:

答案 0 :(得分:1)

检查您的 Postgres 服务是否通过了环境变量:

version: "3"

services:
    django:
        build: .
        restart: on-failure
        container_name: django
        command: bash -rc "python intento/manage.py makemigrations &&
                           python intento/manage.py migrate &&
                           gunicorn --limit-request-line 8190 --workers=3
                           --chdir /usr/src/app/src wsgi:application --bind 0.0.0.0:8000"
        volumes:
            - .:/usr/src/app
        expose:
            - 8000
        env_file:
            - ./.env
        depends_on:
            - pgdb
    pgdb:
        image: postgres
        restart: on-failure
        container_name: pgdb
        environment:
            POSTGRES_USER: ${DB_USER}
            POSTGRES_PASSWORD: ${DB_PASSWORD}
            POSTGRES_DB: ${DB_NAME}

编辑:刚刚看到你给出的例子,在你的 Postgres 环境属性中更改 = :

答案 1 :(得分:1)

如您所说,.env 文件是为 docker 构建设置环境变量的好习惯。
根据您的问题/问题:

<块引用>

我不确定我是否仍然需要在我的系统上本地创建数据库,或者 Docker 是否会自动处理它。

如果您还使用 docker-compose 部署 postgres 容器,则不必在本地创建数据库。如果是这种情况,我建议您将这两个容器连接到您选择的网络并命名容器,以便 django 容器可以使用主机名作为 postgres。 可以有选择地将 .env 文件提供给容器(可能是您在粘贴 docker-compose 文件时缩进移动了),以下 docker-compose.yml 文件应如下所示

   version: '3.5'

services:
  postgres:
    container_name: postgres
    image: postgres:11.6
    ports:
      - "5432:5432"
    environment:
      - POSTGRES_PASSWORD=${DB_PASSWORD}
      - POSTGRES_DB=${DB_NAME}
      - POSTGRES_USER=${DB_USER}
    volumes:
      - ~/srv/docker/template-postgres/data:/var/lib/postgresql/data:rw
    networks:
      - network_name

 django:
   container_name: django
   build:
     context: .
     dockerfile: ./conf/django/Dockerfile.windows
     command: python manage.py runserver 0.0.0.0:8000
    ports:
      - "8000:8000"
    volumes:
      - ./back:/app:rw
    depends_on:
      - postgres
    env_file:
      - .env
    networks:
      - network_name

networks:
  network_name:
    name: network_name
  

您可能会遇到用户的权限问题,因此您可能需要调查 this 问题,以指导您为数据库创建 Dockerfile

答案 2 :(得分:0)

当您第一次运行 docker-compose up 时,Postgres will initialize the DB 和配置的 POSTGRES_* 变量。

之后,如果您更改了这些变量之一,您也需要通过 psql 手动将它们重置到 DB 或执行 docker-compose rm postgres; docker-compose up postgres 以使用新变量重新创建 DB。

警告:docker-compose rm postgres 将删除您当前的数据库。

This answer 建议 docker-compose down -v 也擦除您的音量。