Docker无法识别.env postgres variabls

2024-10-03 06:20:35 发布

您现在位置:Python中文网/ 问答频道 /正文

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

Tags: djangocomposedockernameenvdbcontainerpostgres
3条回答

如您所述.env文件是为docker构建设置环境变量的良好实践。
根据你的问题:

I am not sure if I still need to create the database locally on my system, or whether Docker handles it automatically.

如果同时使用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

检查您的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环境属性中的=:

第一次运行docker-compose up时,使用配置的POSTGRES_*变量Postgres will initialize the DB

之后,如果更改了其中一个变量,则需要通过psql或执行docker-compose rm postgres; docker-compose up postgres手动将它们重置为DB,以使用新变量重新创建DB

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

This answer建议docker-compose down -v擦除您的卷

相关问题 更多 >