如何在dokku中复制couchdb

如何在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

我想在app
www
中拍摄一个运行数据库的快照,并将其放入app
staging
。使用克隆或创建/导入进行此操作时,所有数据都不可用

我该怎么做

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条记录长,对我来说就不一样了。在原始应用程序中,我可以访问数据,但如果我将其链接到其他应用程序,则无法访问数据。