这是我参与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/data
、chmod 0700 /postgres/data
)。
步骤:
- 数据库初始化的命令是:/usr/lib/postgresql/9.6/bin/pg_ctl init --pgdata=/home/postgresql/data。
- 启动数据库命令:/usr/lib/postgresql/9.6/bin/pg_ctl start --pgdata=/home/postgresql/data。
- 制作登录执行命令:
写一个可执行脚本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数据就是启动了。