首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在dokku中复制couchdb

如何在dokku中复制couchdb
EN

Stack Overflow用户
提问于 2017-11-01 21:27:19
回答 2查看 181关注 0票数 5

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

我该怎么做呢?

代码语言:javascript
复制
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个文档。

代码语言:javascript
复制
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

因此,克隆中没有错误。然后我跑

代码语言:javascript
复制
dokku couchdb:link staging_www staging
dokku couchdb:promote staging_www staging

并且没有错误,但是如果我检查数据库:

代码语言:javascript
复制
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应用程序中的任何数据。

同样的,我也尝试过

代码语言:javascript
复制
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

没有错误,但我最终在数据库中找到了1个文档。

我该怎么做?

EN

回答 2

Stack Overflow用户

发布于 2017-11-09 11:37:25

使用dokku 0.9.4和'dokku couchdb service plugin‘1.0.0

解决方案非常简单。在第一次尝试之后

root@dokku01:~# dokku couchdb:clone www staging_www

并且克隆db失败。你需要销毁staging_www

root@dokku01:~# dokku couchdb:destroy staging_www

再做一次克隆。

root@dokku01:~# dokku couchdb:clone www staging_www

现在它将像预期的那样工作。您可以使用以下命令检查新数据库

root@dokku01:~# curl -X GET 'http://staging_www:password@dokku-couchdb-staging-www:5555/staging_www/_all_docs?include_docs=true&attachments=true'

从www导出,然后在新创建的staging_www中导入转储也是可行的。

这是CouchDB插件中的一个错误,找出它的根本原因将是一件非常有趣的事情。

更新

此错误的根本原因是用于备份和还原'couchdb- backup‘的bash脚本。在某些情况下,脚本中的“curl调用”无法到达数据库,因此恢复操作不起作用。

克隆数据库是:创建新实例,导出(备份)旧数据,然后在新数据库中导入(恢复)该备份。

下面的脚本是来自couchdb服务插件的更新的'clone‘脚本。它对“couchdb-backup”导入怪癖的恢复能力更强。

代码语言:javascript
复制
#!/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 "$@"

/var/lib/dokku/plugins/available/couchdb/subcommands/clone上的旧版本应该替换为这个新版本。

票数 0
EN

Stack Overflow用户

发布于 2017-11-04 21:08:00

我通常只使用couchdb dokku插件found here

简单易用

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47055971

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档