如何在我的Dockerfile所基于的图像的VOLUME中写入和保存数据?

时间:2016-07-08 12:57:59

标签: docker couchbase dockerfile

不确定我的标题是否清楚,对不起。

我有一个Dockerfile从Couchbase图片开始:

FROM couchbase:4.5.0

我想在Dockerfile中实现的是启动Couchbase服务器,初始化一些东西(集群,存储桶,一些设计文档和一些视图)。

今天我用它来实现它:

COPY configure-cluster.sh /
RUN chmod u+x /configure-cluster.sh
RUN /configure-cluster.sh

configure-cluster.sh的内容:

/entrypoint.sh couchbase-server &
sleep 15
couchbase-cli cluster-init \
-c localhost:8091 \
--cluster-init-username=Administrator \
--cluster-init-password=password \
--cluster-init-port=8091 \
--services=data,index,query,fts \
--cluster-ramsize=512 \
--cluster-index-ramsize=512 \
--cluster-fts-ramsize=256
# Additional bucket/design document/view configuration

然而,当我运行构建的图像时,我注意到我的配置都没有。我很确定会发生这种情况,因为在couchbase:4.5.0 Dockerfile中,最后一步是

VOLUME /opt/couchbase/var

这正是存储所有Couchbase配置(集群,存储桶,设计文档,视图)的路径。根据{{​​3}}:

  

注意:如果任何构建步骤更改了卷之后的数据   已经宣布,这些更改将被丢弃。

所以我的问题是: 是否有一种干净的方式来满足我的需求?我觉得这正是Dockerfile RUN步骤中应该属于的那种东西,而不是ENTRYPOINT步骤(在每次启动时运行)一个容器,而不仅仅是在容器初始化期间。)

加分问题:我没有看到在Couchbase Dockerfile中声明此VOLUME的重点。它们阻止用户准备已经根据需要定制的图像,我不明白为什么我需要在容器中注入空卷。任何人都有这方面的见解吗?

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

如果所有配置都存储在卷内,并且您的子映像只是执行写入此卷的配置,那么更好的解决方案是按原样使用父映像,并在部署映像时初始化卷

在父图像中创建卷后,没有干净的方法可以在此卷中创建具有不同内容的子图像,您可以做的最好的事情是更新入口点以包含将某些内容复制到缺少标记文件时启动时的卷,并在副本中包含该标记文件。

答案 1 :(得分:0)

这与音量无关,但与docker管理ENTRYPOINT和CMD命令的方式有关。

当您构建映像时,RUN命令会启动具有正确配置数据的couchbase服务器,但是当您实际从映像启动容器时,因为您尚未在dockerfile中声明任何入口点或CMD,上图中的CMD将会启动。

我对couchbase和配置的工作方式一无所知,但我猜是问题就在那里。

现在,在所有VOLUME事情上,重点是确保可以使用docker run命令行的--volumes-from选项从另一个容器访问数据。

再次,我对couchbase的了解是空的,所以我不知道配置是如何工作的,但假设你想要实现的唯一事情就是在/opt/couchbase/var中使用你自己的配置文件启动couchbase映像,你不是需要为此建立一个图像,只需做一个

docker run -d -v <path to your config>:/opt/couchbase/var couchbase:4.5.0

如果你想让它成为一个图像以便更好地部署,我的建议是在你的conf文件的docker文件中使用COPY命令:

COPY ./myconf / opt / couchbase / var

不要忘记在dockerfile末尾使用正确的命令或入口点see comments on my question here