как сделать резервную копию базы данных в докере

Я запускаю свое приложение, используя 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:

Как вы можете видеть здесь, я использую named volume для управления состоянием postgres.

Согласно официальным документам, я могу сделать резервную копию тома, как показано ниже

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

В некоторых других руководствах я предлагаю функцию pg-dump предоставляемую postgres для резервного копирования.

pg_dump -Fc database_name_here > database.bak

Думаю, мне нужно будет зайти в контейнер postgres, чтобы выполнить эту функцию, и установить каталог резервного копирования на хост.

Является ли один подход лучше/предпочтительнее другого?

Ответ 1

Для запуска 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

Также вы можете использовать докеры -c ompose analog of exec. В этом случае вы можете использовать короткое имя службы (postgres) вместо полного имени контейнера (composeproject_postgres).

docker exec

докер -c ompose exec

pg_restore

Ответ 2

Я просто передаю контейнер, работающий с базой данных. Затем я нажимаю это новое изображение в свой частный реестр. Что бы ни случилось с приложением или базой данных, я всегда могу просто вытащить его из своего реестра и получить его в кратчайшие сроки.

docker commit [container-name] [domain:port/'new-image-name']

Затем после этого я нажимаю изображение в свой реестр.

docker push [new-image-name]

Если мне когда-либо понадобится восстановить эту базу данных, я просто вытащил ее из своего собственного реестра.

docker pull [domain:port/'new-image-name']

Так что просто уточнить, это: [domain: port/'new-image-name']

Будет выглядеть так: myregistrydomain.com:5000/dbSep

Ответ 3

Так как у вас есть

expose:     
 - "5432"

Вы можете запустить

pg_dump -U <user> -h localhost -Fc <db_name> > 1.dump

pg_dump подключится к порту 5432, чтобы сделать дамп, так как он lissensed postgres в контейнере, вы будете выгружать дб из контейнера