我有一个关于停止数据库容器的问题。
- 我有一个运行 postgresql的docker 映像。当我用这个图像创建一个容器时:
sudo docker run --name db -d asg1612/postgresql
- 它运行命令:
/usr/lib/postgresql/9.3/bin/postgres -D /var/lib/postgresql/9.3/main -c config_file=/etc/postgresql/9.3/main/postgresql.conf
并且目录/var/lib/pgdata被创建为容器卷
我停止容器:
sudo docker stop db
数据库会优雅地停止吗?
我会有损坏的数据吗?
无论数据库是否“优雅地”停止,您都不会有损坏的数据。PostgreSQL 是崩溃安全的,除非你另外配置它,只要底层文件系统和磁盘存储尊重磁盘刷新请求 (fsync)。您丢失了正在进行的交易,但没有任何东西被破坏或半途而废。即使您
SIGKILL
(kill -9
) 服务器也是如此,尽管这并不意味着定期执行此操作是一个好主意。您将遇到的主要问题是,如果 PostgreSQL 服务器突然关闭,下次启动可能需要更长的时间,因为它必须做更多的工作来恢复已提交但尚未完全应用的工作。(简单化)。
如果容器中没有
init
运行(sysvinit/systemd/upstart),那么很可能不会执行正常关闭,除非您明确为 docker 提供了某种关闭脚本。(我还没有与 docker 合作过)。一些快速搜索表明它只是向SIGTERM
容器中的进程发送一个。这对 PostgreSQL 来说很好,实际上pg_ctl -m smart
是. 可能需要一段时间才能停止,因此您可以选择使用SIGINT
来强制事务中止并更快地关闭。