如何使用容器目录的内容build立主机目录?

我想要做的是设置一个鬼魂的docker容器,我可以很容易地修改主题和其他内容。 因此,我正在使/ opt / ghost /内容成为一个卷并将其挂载到主机上。

它看起来像我将不得不手动将主题复制到主机目录,因为当我挂载它时,它是一个空目录。 所以我的内容目录是完全空的。 我很确定我做错了什么。

我已经尝试了几个不同的变体,包括使用默认的主题文件夹ADD,将VOLUME放在Dockerfile的末尾。 我不断地结束了一个空的内容目录。

有没有人有一个Dockerfile做类似的工作,我可以看看?

或者,也许我可以使用docker cp命令以某种方式填充卷?

我可能会错过一些明显的东西,或者在我尝试实现这个目标时犯了一个愚蠢的错误。 但基本的是,我希望能够使用主机安装的卷上传一组新的文件到ghost主题目录中,默认情况下还有casper主题。

这就是我现在在Dockerfile中所拥有的:

 FROM ubuntu:12.04 MAINTAINER Jason Livesay "ithkuil@gmail.com" RUN apt-get install -y python-software-properties RUN add-apt-repository ppa:chris-lea/node.js RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe" > /etc/apt/sources.list RUN apt-get -qq update RUN apt-get install -y sudo curl unzip nodejs=0.10.20-1chl1~precise1 RUN curl -L https://en.ghost.org/zip/ghost-0.3.2.zip > /tmp/ghost.zip RUN useradd ghost RUN mkdir -p /opt/ghost WORKDIR /opt/ghost RUN unzip /tmp/ghost.zip RUN npm install --production # Volumes RUN mkdir /data ADD run /usr/local/bin/run ADD config.js /opt/ghost/config.js ADD content /opt/ghost/content/ RUN chown -R ghost:ghost /opt/ghost ENV NODE_ENV production ENV GHOST_URL http://my-ghost-blog.com EXPOSE 2368 CMD ["/usr/local/bin/run"] VOLUME ["/data", "/opt/ghost/content"] 

据我所知,空的主机挂载(绑定)卷仍然不会收到构build过程中build立的目录的内容,但从数据容器引用-volumes-WILL。

所以现在我想,答案是,不是编写代码来解决非初始化主机装入卷,而是忘记主机装入卷,而是使用数据容器。

数据容器使用与您要保存数据的图像相同的图像(因此它们具有相同的目录等)。

docker run -d --name myapp_data mystuff/myapp echo Data container for myapp

请注意,它将运行,然后退出,所以您的数据容器的卷不会保持运行。 如果你想保持它们运行,你可以使用sleep infinity而不是echo ,尽pipe这显然需要更多的资源,没有必要或有用,除非你有一些具体的原因 – 比如假设所有相关的容器仍然是运行。

然后使用--volumes-from来使用数据容器中的目录:

docker run -d --name myapp --volumes-from myapp_data

https://docs.docker.com/userguide/dockervolumes/

在实际添加内容之前,您需要放置VOLUME指令。

我的答案是完全错误的! 看看这里似乎实际上是一个错误。 如果VOLUME命令发生在容器中已经存在的目录之后,那么更改不会持久。

Dockerfile应该总是以CMD或入口点结束。

UPDATE

我的解决scheme是在容器主目录中添加文件,然后使用shell脚本作为入口点,在这里我将把文件复制到共享卷中并执行所有其他任务。

我一直在看同样的事情。 我遇到的问题是我正在使用相对本地安装path,如下所示:

 docker run -i -t -v ../data:/opt/data image 

切换到一个绝对的本地path为我解决了这个问题:

 docker run -i -t -v /path/to/my/data:/opt/data image 

你能确认你是否正在做一个相对path,这是否有帮助?

如果使用run命令装载,Docker V1.8.1将保留卷中的数据。 从docker文档:

 Volumes are initialized when a container is created. If the container's base image contains data at the specified mount point, that existing data is copied into the new volume upon volume initialization. 

例如:图像定义了

 /var/www/html 

作为一个卷,并填充一个Web应用程序的数据。 您的docker主机提供了一个挂载目录

 /my/host/dir 

你开始的图像

 docker run -v /my/host/dir:/var/www/html image 

那么您将从hosts / my / host / dir中的/ var / www / html获取所有数据即使删除容器或映像,此数据也将保留。