PostgreSQL在docker中保存状态指南

813 阅读2分钟

这是我参与2022首次更文挑战的第32天,活动详情查看2022首次更文挑战

前情提要:最佳的解决办法是将目录(/var/lib/postgresql/data)挂载到宿主机上,一旦实例出了什么问题不会导致数据丢失和配置丢失;另外,一定不要用docker部署生产环境的数据库。

众所周知,我们使用docker的很大一部分原因是为了部署更方便,以及迁移方便,用过docker的人都知道,docker是不适合来放数据库的,对于PostgreSQL而言,一旦docker实例被异常关闭或者docker commit后就会粗线一个问题,数据库状态无法保存,数据全部没了。

当然这也不是绝对的,对于一些对数据并不关系,或者仅用于测试的环境而言就没有关系,对于这种问题网上大部分的资料都是把/var/lib/postgresql/data/映射到宿主机上。今天说说另一种方法,该方法在PostgreSQL9.6、PostgreSQL14上均可使用,以下是解决方法:

postgresql初始化后,数据库的位置默认在:/var/lib/postgresql/data,这个目录下的数据在commit的时候是不会保存的。所以在数据库初化的时候指定新的位置,这样数据库的文件就不会丢失了。比如根目录下:/home/postgresql/data (可能会碰到权限问题,先用root帐户新建postgresql目录,然后切到postgres帐户创建data目录或者chown -R postgres:postgres /home/postgres/datachmod 0700 /postgres/data)。

步骤:

  1. 数据库初始化的命令是:/usr/lib/postgresql/9.6/bin/pg_ctl init --pgdata=/home/postgresql/data。
  2. 启动数据库命令:/usr/lib/postgresql/9.6/bin/pg_ctl start --pgdata=/home/postgresql/data。
  3. 制作登录执行命令:

写一个可执行脚本postgresql.sh,放在/bin目录下,然后修权限(chmod 777 /bin/postgresql.sh)内容如下:

#!/bin/bash\
su postgres <<EOF\
/usr/lib/postgresql/9.6/bin/pg_ctl start --pgdata=/home/postgresql/data;\
exit;\
EOF\
/bin/bash

4、制作新的镜像:

ctrl+D退出后执行下面的命令:

docker commit.........

得到一个新的镜像包。

5、开启新的容器

docker run -it --name postgresql -p 5432:5432 postgresql:1.0.0 /bin/postgresql.sh

特别注意:是/bin/postgrsql.sh而不是/bin/bash,这样postgresql数据就是启动了。