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

不知道我的标题是清楚的,对此抱歉。

我有一个从Couchbase图像开始的Dockerfile

 FROM couchbase:4.5.0 

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

今天我用它来实现它:

 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 

但是,当我运行构build的图像,我注意到我的configuration没有在那里。 我很确定发生这种情况,因为在couchbase:4.5.0 Dockerfile中 ,最后一步是

 VOLUME /opt/couchbase/var 

这正是所有Couchbaseconfiguration(集群,存储桶,devise文档,视图)存储的path。 根据Docker关于Dockerfile的VOLUME的文档 :

注意:如果任何构build步骤在声明之后更改了卷中的数据,则这些更改将被丢弃。

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

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

感谢您的帮助!

如果所有configuration都存储在卷中,并且您的子映像只是执行写入该卷的configuration,则更好的解决scheme是按原样使用父映像,并在部署映像时初始化卷。

一旦在父映像中创build了卷,就没有办法在这个卷中创build一个具有不同内容的子映像,但是最好的办法是更新入口点以包含初始化步骤,在启动时将一些内容复制到卷中当一个标志文件丢失,并在你的副本中包含该标志文件。

这与音量无关,但与dockerpipe理ENTRYPOINT和CMD命令的方式相关。

发生什么事是,当你build立你的图像,运行命令确实启动一个couchbase服务器与你正确的configuration数据,但是当你真的从你的图像启动一个容器,因为你还没有在你的dockerfile中声明任何入口点或CMD,CMD上面的图像将被启动。

我不知道有关couchbase和configuration的工作方式,但我的猜测是问题在那里。

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

再一次,我的有关couchbase的知识是空的,所以我不知道configuration是如何工作的,但是假设您想要实现的唯一的事情是使用/opt/couchbase/var自己的configuration文件启动couchbase映像,您不需要build立一个形象,只是做一个

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

如果你想使它成为更好部署的映像,我的build议是在你的docker文件中使用COPY命令作为conf文件:

COPY ./myconf / opt / couchbase / var

不要忘记在dockerfile的末尾使用正确的命令或入口点, 请在这里查看关于我的问题的评论

Interesting Posts