【问题标题】:How to dump and restore correctly a postgresql db from docker如何从 docker 正确转储和恢复 postgresql 数据库
【发布时间】:2022-01-04 16:15:39
【问题描述】:

我在尝试从 docker django app environment 备份和恢复我的数据库时遇到了这个错误: error

我首先执行此命令来备份我的整个数据库

docker exec -t project_final-db-1 pg_dumpall -c -U fred2020 > ./db/dump.sql

然后尝试使用此命令恢复

cat dump.sql | docker exec -i --user fred2020 catsitting-db-1 psql -U fred2020 -d postgres 

我有两个容器,一个用于我的 django 应用程序,名为 catsitting-web-1,另一个用于我的 postgresql,名为 catsitting-db-1

我不明白为什么它给了我这个错误,我的 db 用户与我在 dockerfile 中指定的相同...

有什么线索吗? 出于目的的帮助,这是我的 docker 文件配置:

Dockerfile

FROM python:3.9
ENV PYTHONUNBUFFERED=1
WORKDIR /code
COPY requirements.txt /code/
RUN pip install -r requirements.txt
RUN pip install Pillow
COPY . /code/

docker-compose.yml

version: "3.9"
   
services:
  db:
    image: postgres
    environment:
      - POSTGRES_DB=postgres
      - POSTGRES_USER=fred2020
      - POSTGRES_PASSWORD=p*******DD
    expose:
      - "5432"
    ports:
      - 5432:5432
  web:
    build: .
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    depends_on:
      - db

requirements.txt

Django>=3.0,<4.0
psycopg2-binary>=2.8
Pillow==8.1.0

这就是我从笔记本电脑1迁移到笔记本电脑2的过程:

安装 运行命令行进入根目录并运行: git clone https://github.com/XXXXXXXXXXXXXXXX

在命令行进入根目录: cd catsitting

在同一命令行窗口中,运行: docker-compose build --no-cache

在命令行窗口中,您首先需要为 Django 迁移数据库,运行: docker-compose run web python manage.py migrate

在命令行窗口中,您需要应用迁移,运行: docker-compose run web python manage.py makemigrations

在命令行窗口中,你需要导入数据库,运行: cat dump.sql | docker exec -i --user fred2020 catsitting-db-1 psql -U fred2020 -d postgres (为了转储我的数据库,我使用了docker exec -t project_final-db-1 pg_dumpall -c -U fred2020 &gt; ./db/dump.sql

您现在可以运行: docker-compose up

我有什么问题吗?

【问题讨论】:

  • 为什么要使用不同的容器名称来备份和恢复数据库? project_final-db-1 != catsitting-db-1。此外,您不必添加 -d postgres 进行恢复,因为它是默认表名
  • 问题是我在第一台笔记本电脑上工作,我的存储库被称为“project_final”,我从这个 docker 环境中备份,我的容器被命名为“project_final-db-1”,用于 postgresql 数据库。现在我想在新笔记本电脑中恢复该数据库,因为我正在恢复 docker 环境和整个 django 应用程序(使用 db 数据...)。如果从笔记本电脑 1 到笔记本电脑 2 的容器名称不同,这会不会有问题?
  • 该错误明确指出密码验证失败。要么你没有创建用户,要么你没有传递正确的密码,要么你没有为该用户设置适当的权限。
  • 您好,在我的 docker-compose.yml 文件中,提到了“POSTGRES_USER=fred2020”和“POSTGRES_PASSWORD”属性的密码。当我通过 PGADMIN 连接时,我使用相同的用户名和密码。你认为这是我的备份命令行错误吗:docker exec -t project_final-db-1 pg_dumpall -c -U fred2020 &gt; ./db/dump.sql。备份数据库时,我需要如何或在哪里指定密码?这是我的 PGADMIN imgur.com/a/w9Fh78C 的打印屏幕
  • 我在另一台笔记本电脑上再次尝试,但仍然收到此错误消息catsitting-db-1 | 2021-11-27 13:14:40.917 UTC [33] FATAL: password authentication failed for user "fred2020" catsitting-db-1 | 2021-11-27 13:14:40.917 UTC [33] DETAIL: User "fred2020" does not have a valid SCRAM secret. 我已在 pgadmin 中授予用户 fred2020 的所有组成员身份。我真的卡住了……

标签: python django postgresql docker


【解决方案1】:

我解决了! 这是我的 docker postgresql 中的 pg_hba.conf 配置错误的问题 我将值从 scram-sha-256 更改为 md5,它现在可以使用当前数据库显示我的 webapp !!

您知道在我构建 docker 环境时如何指定 md5 吗?默认情况下它会放入 scram-sha-256

【讨论】:

    【解决方案2】:

    你知道为什么当我在容器中默认情况下在新环境中恢复我的转储时,pg_hba.conf 将身份验证方法设置为 scram-sha-256 并完成我的连接工作,我需要编辑该文件并将认证方式设置为md5?

    # TYPE  DATABASE        USER        ADDRESS     METHOD
    local   all             all                     md5
    

    【讨论】:

      【解决方案3】:

      好的,抱歉,我找到了解决方案。 我已经将该行放在我的 docker-compose.yml 中:

      environment:
      - POSTGRES_HOST_AUTH_METHOD=trust
      

      【讨论】:

        猜你喜欢
        • 2020-04-07
        • 2010-12-20
        • 2023-01-02
        • 1970-01-01
        • 1970-01-01
        • 2019-09-27
        • 1970-01-01
        • 2020-07-07
        • 1970-01-01
        相关资源
        最近更新 更多