Docker数据卷与couchbase

我有一个运行Couchbase企业版3.0.2的Docker镜像

它目前在私人存储库中。 所以我们只是说它的名字是:

matt/couchbase 

为了让数据坚持应该去掉matt / couchbase,我创build了一个基于matt / couchbase的数据唯一容器,叫做matt / couchbase-data

Dockerfile看起来像

 FROM matt/couchbase CMD ["true"] VOLUME ["/opt/couchbase/var/lib/couchbase/data"] 

根据couchbasedocker,上面的音量path应该是couchbase存储数据的地方。

所以我运行matt / couchbase-data,然后运行带有–volumes-from链接的matt / couchbase。

这工作正常。 docker检查couchbase显示:

 "Volumes": { "/opt/couchbase/var/lib/couchbase/data": "/var/lib/docker/vfs/dir/f129a034a2b0474392fe98bdc37429f172be26c93a058540f3a1043d324c0b1c" }, "VolumesRW": { "/opt/couchbase/var/lib/couchbase/data": true } 

和docker检查couchbase数据包含:

 "Volumes": { "/opt/couchbase/var/lib/couchbase/data": "/var/lib/docker/vfs/dir/f129a034a2b0474392fe98bdc37429f172be26c93a058540f3a1043d324c0b1c" }, "VolumesRW": { "/opt/couchbase/var/lib/couchbase/data": true } 

所以看起来这两个容器连接起来很好。

但问题是这样的。 当我停止名为“couchbase”的容器,并使用docker rm将其删除后,再次启动couchbase,即使执行了docker-inspect指示该卷仍然以与之前相同的实际path仍然存在,数据已消失。 即/ var / lib / docker / vfs / dir / f129a034a2b0474392fe98bdc37429f172be26c93a058540f3a1043d324c0b1c

这可能是相关的。 该couchbase服务器正在启动与我从另一个docker couchbase项目(抱歉,暂时失去了链接)获得以下初始化脚本。

我想也许下面的cluster-init(这是我默认运行的couchbase)可能会重置数据。 但根据文档,它只是设置集群的用户名,密码和端口。

有任何想法吗?

 #!/bin/bash set +e echo 'removing document size limit' sed -i 's/return getStringBytes(json) > self.docBytesLimit;/return false/g' /opt/couchbase/lib/ns_server/erlang/lib/ns_server/priv/public/js/documents.js echo 'starting couchbase' /etc/init.d/couchbase-server restart wait_for_start() { "$@" while [ $? -ne 0 ] do echo 'waiting for couchbase to start' sleep 1 "$@" done } if [ -z "$CLUSTER_INIT_USER" ] || [ -z "$CLUSTER_INIT_PASSWORD" ]; then echo >&2 'error: Couchbase not initialized because CLUSTER_INIT_USER or CLUSTER_INIT_PASSWORD was not set' echo >&2 ' Did you forget to add -e CLUSTER_INIT_USER=... -e CLUSTER_INIT_PASSWORD=... ?' exit 1 fi if [ -z "$COUCHBASE_PORT_8091_TCP" ]; then if [ -z "$CLUSTER_RAM_SIZE" ]; then CLUSTER_RAM_SIZE=1024 fi echo 'initializing cluster...' wait_for_start /opt/couchbase/bin/couchbase-cli cluster-init -c 127.0.0.1:8091 --cluster-init-username="$CLUSTER_INIT_USER" --cluster-init-password="$CLUSTER_INIT_PASSWORD" --cluster-init-ramsize="$CLUSTER_RAM_SIZE" -u "$CLUSTER_INIT_USER" -p "$CLUSTER_INIT_PASSWORD" if [ -n "$SAMPLE_BUCKETS" ]; then curl http://"$CLUSTER_INIT_USER":"$CLUSTER_INIT_PASSWORD"@127.0.0.1:8091/sampleBuckets/install --data "[$SAMPLE_BUCKETS]" fi else ip=`hostname --ip-address` wait_for_start /opt/couchbase/bin/couchbase-cli server-add -c $COUCHBASE_PORT_8091_TCP_ADDR:$COUCHBASE_PORT_8091_TCP_PORT --user="$CLUSTER_INIT_USER" --password="$CLUSTER_INIT_PASSWORD" --server-add=$ip:8091 fi trap "/etc/init.d/couchbase-server stop" exit INT TERM pid_file=/opt/couchbase/var/lib/couchbase/couchbase-server.pid # can't use 'wait $(<"$pid_file")' as process not child of shell while [ -e /proc/$(<"$pid_file") ]; do sleep 1; done 

您应该考虑在卷中保留整个/ opt / couchbase / var目录,而不仅仅是/ opt / couchbase / var / lib / couchbase / data子目录。

原因是在/ opt / couchbase / var中存在“集群状态”。 如果丢失了,它会认为它是一个新的容器实例上的全新群集。

我写了一篇博客文章 ,介绍了一个在Docker下运行couchbase服务器的完整示例。 Dockerfile和所有使用的脚本都在github上 。