設定Windows自動備份PostgreSQL Docker容器裡的資料庫
因為前面使用Docker部署Miniflux RSS Reader,是裝在Windows Docker Desktop,考慮之後也許會換到Windows Rancher Desktop或Windows Podman Desktop(?),所以採通用方式來備份。
如何備份和還原資料庫
開啟命令列進入PostgreSQL容器:
docker container exec -it <container-name> bash -l建立
/var/backups/db資料夾:cd /var/backups mkdir db備份資料庫:
PGPASSWORD=<db-password> pg_dump -U <db-username> <db-name> -Fc > /var/backups/db/db.dump還原資料庫:
pg_restore -d <db-name> /var/backups/db/db.dump -c -U <db-username>
離開容器,將容器裡的備份檔複製到本機:
docker cp <container-name>:/var/backups/db/db.dump C:\Docker\Miniflux或是將本機裡的備份檔複製到容器裡:
docker cp C:\Docker\Miniflux\db\db.dump <container-name>:/var/backups/db
建立自動備份執行檔
Windows使用Notepad++建立BASH:
#!/bin/bash PGPASSWORD=<db-password> pg_dump -U <db-username> <db-name> -Fc > /var/backups/db/$(date +%Y-%m-%d_%H-%M-%S).dump cd /var/backups/db ls -t | awk 'NR>7' | xargs rm -f最後一行是刪除舊的備份檔,保留最新7個備份檔。存檔前換行格式要改成UNIX格式(LF),另存為
bash-file.sh。將
bash-file.sh複製到PostgreSQL容器裡的/var/backups資料夾:docker cp C:\Docker\Miniflux\<bash-file.sh> <container-name>:/var/backups測試
bash-file.sh能否正確執行:docker exec -it <container-name> sh /var/backups/<bash-file.sh>建立Windows batch──將步驟3命令另存為
bat-file-1.bat,以下內容存為bat-file-2.bat:rd /s /q C:\Docker\Miniflux\db timeout /t 2 docker cp <container-name>:/var/backups/db C:\Docker\Miniflux先刪除本機備份檔,再將容器裡的備份檔複製到本機,保持兩邊檔案一致。
bat-file-1.bat和bat-file-2.bat都丟到Windows的工作排程器,系統便會自動定時備份。
參考文章: