我如何在docker中备份数据库

Kan*_*naj 15 postgresql docker

我使用docker-compose和下面的yml文件运行我的应用程序

  postgres:
    container_name: postgres
    image: postgres:${POSTGRES_VERSION}
    volumes:
      - postgresdata:/var/lib/postgresql/data
    expose:
      - "5432"
    environment:
      - POSTGRES_DB=42EXP
      - POSTGRES_USER=${POSTGRES_USER}
      - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}

  node:
    container_name: node
    links:
      - postgres:postgres
    depends_on:
      - postgres

volumes:
  postgresdata:
Run Code Online (Sandbox Code Playgroud)

正如你在这里看到的,我正在使用a named volume来管理postgres状态.

根据官方文档,我可以备份如下的卷

docker run --rm --volumes postgresdata:/var/lib/postgresql/data -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata
Run Code Online (Sandbox Code Playgroud)

其他一些教程建议我使用pg-dumppostgres提供的功能进行备份.

pg_dump -Fc database_name_here > database.bak
Run Code Online (Sandbox Code Playgroud)

我想我必须进入postgres容器才能执行此功能并将备份目录挂载到主机.

一种方法比另一种更好/更好吗?

tck*_*tck 42

要运行pg_dump,您可以使用docker exec命令:

要备份:

docker exec -u <your_postgres_user> <postgres_container_name> pg_dump -Fc <database_name_here> > db.dump

删除db(不要在生产中执行,仅用于测试目的!!!):

docker exec -u <your_postgres_user> <postgres_container_name> psql -c 'DROP DATABASE <your_db_name>'

恢复:

docker exec -i -u <your_postgres_user> <postgres_container_name> pg_restore -C -d postgres < db.dump

你也可以使用docker-compose模拟exec.在这种情况下,您可以使用短服务名称(postgres)而不是完整容器名称(composeproject_postgres).

码头工人

docker-compose exec

那么pg_restore

  • 当我调用docker exec -u <your_postgres_user> <postgres_container_name> pg_restore -C -d postgres <db.dump时,呼叫挂起. (2认同)
  • 我的错,你应该为 docker exec 添加 --interactive 选项。我编辑了原始答案来解决这个问题。 (2认同)