如何使用容器目录的内容安装主机目录?

时间:2013-12-31 11:08:18

标签: docker

我要做的是为ghost设置一个docker容器,我可以轻松地修改主题和其他内容。所以我正在制作/ opt / ghost / content一个卷并将其安装在主机上。

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

我尝试了一些不同的变体,包括将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"]

4 个答案:

答案 0 :(得分:4)

据我所知,空的主机挂载(绑定)卷仍然不会收到构建期间设置的目录内容,但是用WILL卷引用数据容器 -

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

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

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

请注意,它将运行然后退出,因此卷的数据容器将不会继续运行。如果你想让它们继续运行,你可以使用类似sleep infinity而不是echo的东西,虽然这显然会占用更多资源,除非你有某些特定的理由,否则它们没有必要或有用 - 比如假设所有相关容器仍在运行。

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

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

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

答案 1 :(得分:3)

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

我的回答完全错了! Look here似乎确实存在一个错误。如果在容器中已存在该目录之后发生VOLUME命令,则不会保留更改。

Dockerfile应始终以CMD或ENTRYPOINT结束。

<强>更新

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

答案 2 :(得分:1)

我一直在研究同样的事情。我遇到的问题是我使用的是相对本地挂载路径,如:

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

切换到绝对本地路径为我解决了这个问题:

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

您能否确认自己是否正在做相对路径,以及这是否有帮助?

答案 3 :(得分:0)

如果使用run命令挂载数据,则Docker V1.8.1会保留卷中的数据。来自the docker docs:

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 hosts提供了一个挂载目录

/my/host/dir

您可以通过

启动图像
docker run -v /my/host/dir:/var/www/html image

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