【问题标题】:Docker does not recognize .env postgres variablsDocker 无法识别 .env postgres 变量
【发布时间】:2021-09-21 21:35:08
【问题描述】:

编辑: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

【问题讨论】:

  • 你在使用 docker-compose.yml 吗?如果有,可以分享一下吗?
  • 我问是因为您还需要将 env 文件传递​​给 compose 中的 postgres 服务。
  • 刚刚添加;抱歉,如果缩进搞砸了,代码块非常困难。很确定我在它的底部传递了 .env 文件;除非我做错了。

标签: python django postgresql docker


【解决方案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 环境属性中的 = 更改为:

【讨论】:

  • 为什么我只看到那个 LMAO,让我们看看它现在是否可以工作。
  • 也许你需要重建 PostgreSQL 容器?
  • 现在这样做,如果这不起作用,可能会编辑原始问题。不过,我知道环境变量只会在初始启动时被识别,所以也许我需要完全重置。
  • 是的,那也没用。重新措辞原来的问题;希望能对这个问题有不同的看法。
【解决方案2】:

正如您所说,.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

【讨论】:

    【解决方案3】:

    当您第一次运行 docker-compose upPostgres 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 也可以擦除您的音量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-22
      • 2012-05-09
      • 2016-06-24
      • 2019-02-12
      • 2020-07-17
      • 2018-03-18
      • 2020-11-08
      相关资源
      最近更新 更多