我要做的是为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"]
答案 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
答案 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获取所有数据 即使您删除容器或图像,此数据也会保留。