官方鏡像的postgresql啓動以下面的方式來啓動:
docker run -it --rm -d --name postgres -e POSTGRES_PASSWORD=xxx -p 5432:5432 -v /data/postgresql/data:/var/lib/postgresql/data postgres:12
postgresql全備份通過pg_basebackup來執行,因爲要通過postgres用戶來執行,所以命令如下:
docker exec -it --user postgres postgres pg_basebackup -F t -z -R -D /var/lib/postgresql/data/backup
但這個有個問題,pg_basebackup命令本身備份的就是/var/lib/postgresql/data這整個目錄,所以備份文件不能放在這目錄下面,我試過發現它會把部分備份的文件再備份進來。於是,我打算把備份目錄放到其他地方,像下面這樣:
docker exec -it --user postgres postgres pg_basebackup -F t -z -R -D /var/lib/postgresql/backup
但/var/lib/postgresql/backup這個還得在啓動的時候映射一下,不然就備份到容器裏面了,宿主中看不到。於是啓動命令改成下面這樣:
docker run -it --rm -d --name postgres -e POSTGRES_PASSWORD=xxx -p 5432:5432 -v /data/postgresql/data:/var/lib/postgresql/data -v /data/postgresql/backup:/var/lib/postgresql/backup postgres:12
然而再次執行備份命令報錯了:
[root@iZuf6542zl60b5kv3wehbyZ data]# docker exec -it --user postgres postgres pg_basebackup -F t -z -R -D /var/lib/postgresql/backup
pg_basebackup: error: pg_basebackup: error: could not open write-ahead log file "000000010000016B000000A8": Permission denied
原因是/var/lib/postgresql/backup這個目錄映射到宿主目錄只有root用戶有權限,而備份的時候用的是postgres這個用戶,所以沒有權限。可以進入容器,通過root用戶給這個目錄改變目錄屬主爲postgres。
docker exec -it postgres bash
chown -R postgres:postgres /var/lib/postgresql/data/backup
這樣是可以的,不過通常postgresql要除了主庫,可能還要安裝若干個從庫,每次都去改太麻煩了。後面我自己製作了一個鏡像,其實就是在官方鏡像中的docker-entrypoint.sh中添加postgres用戶對/var/lib/postgresql/backup的權限就可以了,這個文件中對/var/lib/postgresql/data做了修改,依葫蘆畫瓢對我的目錄也修改下就可以了。有興趣的可以到docker hub上搜我的鏡像:wjf8882300/postgres:12
自定義鏡像啓動
docker run -it --rm -d --name postgres -e POSTGRES_PASSWORD=xxx -p 5432:5432 -v /data/postgresql/data:/var/lib/postgresql/data -v /data/postgresql/backup:/var/lib/postgresql/backup wjf8882300/postgres:12
直接備份,無需再到容器裏面修改權限了
docker exec -it --user postgres postgres pg_basebackup -F t -z -R -D /var/lib/postgresql/backup
備份結果,可以看到有文件生成
[root@iZuf6542zl60b5kv3wehbyZ backup]# ls
base.tar.gz pg_wal.tar.gz