如何在dokku中复制couchdb
我想在app如何在dokku中复制couchdb,couchdb,dokku,Couchdb,Dokku,我想在appwww中拍摄一个运行数据库的快照,并将其放入appstaging。使用克隆或创建/导入进行此操作时,所有数据都不可用 我该怎么做 matt@server:~$ dokku run www curl http://www:password@dokku-couchdb-www:5555/www {"db_name":"www","doc_count":4966,"doc_del_count":232,"update_seq":46475,"purge_seq":0,"compact_r
www
中拍摄一个运行数据库的快照,并将其放入appstaging
。使用克隆或创建/导入进行此操作时,所有数据都不可用
我该怎么做
matt@server:~$ dokku run www curl http://www:password@dokku-couchdb-www:5555/www
{"db_name":"www","doc_count":4966,"doc_del_count":232,"update_seq":46475,"purge_seq":0,"compact_running":false,"disk_size":3071180923,"data_size":334987077,"instance_start_time":"1500006610823893","disk_format_version":6,"committed_update_seq":46475}
从这里你可以看到有4966份文件
matt@server:~$ dokku couchdb:clone www staging_www
-----> Starting container
Waiting for container to be ready
=====> CouchDB container created: staging_www
DSN: http://staging_www:password@dokku-couchdb-staging-www:5555/staging_www
-----> Copying data from www to staging_www
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 1110M 0 1110M 0 0 30.4M 0 --:--:-- 0:00:36 --:--:-- 31.9M
-----> Done
因此克隆中没有错误。然后我就跑
dokku couchdb:link staging_www staging
dokku couchdb:promote staging_www staging
没有错误,但如果我检查数据库:
matt@server:~$ dokku run staging curl http://staging_www:password@dokku-couchdb-staging-www:5555/staging_www
{"db_name":"staging_www","doc_count":1,"doc_del_count":0,"update_seq":1,"purge_seq":0,"compact_running":false,"disk_size":4188,"data_size":342,"instance_start_time":"1509536857606369","disk_format_version":6,"committed_update_seq":1}
文档计数为1,我无法访问staging
应用程序中的任何数据
我也试过
dokku couchdb:export www > www.couch
dokku couchdb:create staging_www
dokku couchdb:import staging_www < www.couch
dokku couchdb:link staging_www staging
dokku couchdb:promote staging_www staging
dokku couchdb:export www>www.coach
dokku couchdb:创建staging\u www
dokku couchdb:导入登台
dokku couchdb:linkstaging\u www staging
dokku couchdb:升级登台\u www登台
没有错误,但我还是在数据库中找到了1个文档
我打算做什么?我通常只使用couchdb dokku插件
Curl在处理多个文件时会有超时的倾向,所以我使用插件来升级。轻松获得dokku 0.9.4和“dokku couchdb服务插件”1.0.0 解决办法很简单。第一次尝试之后
root@dokku01:~#dokku couchdb:clone www staging_www
无法克隆数据库。你需要摧毁你的网站
root@dokku01:~#dokku couchdb:销毁暂存www
再做一次克隆
root@dokku01:~#dokku couchdb:clone www staging_www
现在它将按预期工作。您可以使用
root@dokku01:~#curl-X GET'http://staging_www:password@dokku couchdb staging www:5555/staging\u www/\u all\u docs?include\u docs=true&attachments=true'
从www导出,然后在新创建的staging_www中导入转储也可以
这是CouchDB插件中的一个bug,找到它的根本原因将非常有趣
更新
此错误的根本原因是用于备份和恢复的bash脚本“couchdb backup”。在某些情况下,脚本中的“curl调用”无法到达数据库,因此还原操作无法工作
克隆数据库是:创建新实例,导出(备份)旧数据,然后在新数据库中导入(恢复)该备份
下面的脚本是从couchdb服务插件更新的“克隆”脚本。它对“couchdb备份”导入怪癖的恢复能力更强
#!/usr/bin/env bash
source "$(dirname "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)")/config"
set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x
source "$PLUGIN_BASE_PATH/common/functions"
source "$(dirname "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)")/functions"
service-clone-cmd() {
#E you can clone an existing service to a new one
#E dokku $PLUGIN_COMMAND_PREFIX:clone lolipop lolipop-2
#A service, service to run command against
#A new-service, name of new service
declare desc="create container <new-name> then copy data from <name> into <new-name>"
local cmd="$PLUGIN_COMMAND_PREFIX:clone" argv=("$@"); [[ ${argv[0]} == "$cmd" ]] && shift 1
declare SERVICE="$1" NEW_SERVICE="$2" CLONE_FLAGS_LIST="${@:3}"
[[ -z "$SERVICE" ]] && dokku_log_fail "Please specify a name for the service"
[[ -z "$NEW_SERVICE" ]] && dokku_log_fail "Please specify a name for the new service"
verify_service_name "$SERVICE"
PLUGIN_IMAGE=$(service_version "$SERVICE" | grep -o "^.*:" | sed -r "s/://g")
PLUGIN_IMAGE_VERSION=$(service_version "$SERVICE" | grep -o ":.*$" | sed -r "s/://g")
service_create "$NEW_SERVICE" "${@:3}"
dokku_log_info1 "Copying data from $SERVICE to $NEW_SERVICE"
attempts=5
attemptcount=0
R=2
succ_str=' Successfully.'
until [[ $R = 0 || $R = 1 ]]; do
attemptcount=$((attemptcount+1))
STDOUT1=$(service_export "$SERVICE" | service_import "$NEW_SERVICE" 2>&1) || true
if [[ ! "$STDOUT1" = *"${succ_str}" ]]; then
if [ $attemptcount = $attempts ]; then
R=1
echo -e "\nERROR: CouchDB Import failed - Stopping\n"
else
echo -e "\nWARN: CouchDB Import Reported an error - Attempt ${attemptcount}/${attempts} - Retrying...\n"
sleep 1
fi
else
R=0
fi
done
dokku_log_info1 "Done"
exit $R
}
service-clone-cmd "$@"
#/usr/bin/env bash
source“$(dirname“$(cd“$(dirname“${BASH_source[0]}”)”&&pwd)”)/config”
set-eo管道故障;[$DOKKU_TRACE]&&set-x
来源“$PLUGIN\u BASE\u PATH/common/functions”
源“$(dirname“$(cd“$(dirname“${BASH_source[0]}”)”&&pwd)”)/functions”
service-clone-cmd(){
#E您可以将现有服务克隆到新服务
#E dokku$PLUGIN_命令_前缀:克隆lolipop lolipop-2
#要针对其运行命令的服务
#新服务、新服务的名称
declare desc=“创建容器,然后将数据从复制到”
local cmd=“$PLUGIN_COMMAND_PREFIX:clone”argv=(“$@”);[[[${argv[0]}==“$cmd”]]]&移位1
declare SERVICE=“$1”NEW_SERVICE=“$2”CLONE_FLAGS_LIST=“${@:3}”
[[-z“$SERVICE”]&&dokku_log_fail“请指定服务的名称”
[[-z“$NEW_SERVICE”]&&dokku_log_fail“请指定新服务的名称”
验证服务名称“$service”
PLUGIN_IMAGE=$(服务版本“$service”| grep-o”^.*:“| sed-r”s/://g”)
PLUGIN_IMAGE_VERSION=$(service_VERSION“$service”| grep-o::.*$”| sed-r“s/://g”)
服务\u创建“$NEW\u服务”${@:3}
dokku_log_info1“将数据从$SERVICE复制到$NEW_SERVICE”
尝试次数=5次
尝试计数=0
R=2
success_str='Successfully'
直到[$R=0 | |$R=1]]为止
attemptcount=$((attemptcount+1))
STDOUT1=$(服务导出“$服务”|服务导入“$新服务”2>&1)|真
如果[!“$STDOUT1”=*“${succu str}”];则
如果[$attemptcount=$attempts];则
R=1
echo-e“\n错误:CouchDB导入失败-正在停止\n”
其他的
echo-e“\n警告:CouchDB导入报告了一个错误-尝试${attemptcount}/${attempts}-重试…\n”
睡眠1
fi
其他的
R=0
fi
完成
dokku_log_info1“完成”
退出$R
}
服务克隆cmd“$@”
旧版本/var/lib/dokku/plugins/available/couchdb/subcommands/clone应该替换为新版本。你怎么知道这不是@MattEllen使用的插件?谢谢,jtillman。这就是我正在使用的插件。这不是超时问题,一切都正常完成。有些事情出了问题。由于某些原因,无法在Vagrant VM Ubuntu 16.04上设置dokku。我无法部署应用程序来测试您的场景。git推送只是挂起了,但这不起作用。您是否像我的示例中那样在dokku应用程序之间进行克隆?我描述了我所采取的步骤。我重复了这些步骤,以确保它每次都对我有效。我的测试是在数字海洋512Mb节点上完成的。我们的环境不同,这似乎是导致故障的原因。如果克隆数据库,它将链接到原始应用程序。您是否将DB链接到其他应用程序?链接到www应用程序或独立应用程序都是相同的。第二次克隆是成功的。也许数据库的大小很重要,我的www数据库只有5条记录长,对我来说就不一样了。在原始应用程序中,我可以访问数据,但如果我将其链接到其他应用程序,则无法访问数据。