在docker中恢复postgres
我遇到了很多尝试使用docker exec
和postgresql psql
实用程序来恢复在docker 1.3中运行的postgresql安装的一系列问题。 我有一个备份运行确定通过docker exec mycontainer pg_dumpall --clean --user=postgres --no-password > /tmp/backup.sql
。
我遇到了尝试恢复的问题,其中包括:
-
docker exec
仅在容器正在运行时才起作用,但psql
无法用主动连接的客户端正确恢复 -
pg_ctl stop
将退出postgres服务器进程,该进程会停止您正在运行的主容器和docker exec
进程。 -
docker exec
以root身份运行,但是pg_ctl
必须以postgres身份运行(我试图使用pg_ctl来停止postgres,这样恢复就可以运行)
所以考虑到postgresql容器正在运行并为应用程序提供活动连接的情况,我该如何恢复? 寻找干净停止,运行恢复,启动等的细节
Env是docker 1.3,postgresql 9.4,数据/var/lib/postgresql/data
在容器中的/var/lib/postgresql/data
上的/var/lib/postgresql/data
中。 在docker主机文件系统上有一个有效的.sql
备份文件。
更新: FYI我可以开放任何解决scheme,无论是否涉及docker exec
。 如果我应该运行一个单独的容器并链接到主postgresql容器,并通过TCP与它交谈,例如,只要我得到一些可行的stream程就没有问题。
这是我迄今为止。 build议欢迎。 这是一个bash脚本(在构build过程中插入了一些胡须variables),用于在Docker主机上运行。
#!/bin/bash docker_sql() { docker exec \ --interactive \ --tty \ "${container}" \ psql --user="${user}" --no-password --file="$1" } export DOCKER_HOST=tcp://localhost:2375 container="{{appName}}_db" user=postgres backup_path="$1" if [[ -z "${backup_path}" ]]; then echo "Provide a path to a backup file" 1>&2 exit 1 fi backup_file=$(basename "${backup_path}") restore_file=$(echo "${backup_file}" | sed -es/.\bz2//) restore_path="/var/lib/postgresql/data/${restore_file}" bunzip2 --stdout "${backup_path}" > "/var/local/"${container}/"${restore_file}" terminate_path="/var/lib/postgresql/data/terminate.sql" cat <<EOF > "/var/local/${container}/terminate.sql" revoke connect on database {{appName}} from public; alter database {{appName}} connection limit 0; select pg_terminate_backend(pid) from pg_stat_activity where pid <> pg_backend_pid() and datname='{{appName}}'; EOF docker_sql "${terminate_path}" docker_sql "${restore_path}"
你如何正常启动和停止数据库?
①同一个容器
如果我有一个绑定在同一个容器中的数据库的设置,我将有一个容器启动脚本,它首先在后台启动PostgreSQL,然后exec
应用程序。
在这种情况下,很容易在应用程序的exec
之前插入restore命令,closures容器,
②分开容器
当然,如你所说,将数据库服务从应用程序中分离出来是最好的解决scheme,毕竟它们是单独的服务。
③pipe理容器
你写的你的应用程序有数据库文件“数据卷装”。 在这种情况下,你可以创build一个pipe理容器,也就是那些已经挂载的文件,它只启动PostgreSQL,恢复备份,然后再次退出。 然后,closures应用程序容器,在同一个数据库卷上启动还原容器,等到它退出,然后再次启动应用程序容器。
④主持人
同样,你可以在主机上的DB卷上运行PostgreSQL。 这违反了隔离原则,并且需要在主机上设置数据库,所以你可能不想这样做。
我个人的build议
我首先select②,然后①,然后(在你的设置中)③,然后按照select的顺序④。