【发布时间】:2015-07-30 14:23:12
【问题描述】:
我以为我了解文档,但也许我没有。我的印象是-v /HOST/PATH:/CONTAINER/PATH 标志是双向的。如果容器中有文件或目录,它们将被镜像到主机上,为我们提供了一种方法来保留目录和文件,即使在删除 docker 容器后也是如此。
在官方的 MySQL docker 镜像中,这是可行的。 /var/lib/mysql 可以绑定到主机,并在重启和更换容器的同时保留主机上的数据。
我为 sphinxsearch-2.2.9 写了一个 docker 文件,只是作为练习,为了学习和理解,这里是:
FROM debian
ENV SPHINX_VERSION=2.2.9-release
RUN apt-get update -qq && DEBIAN_FRONTEND=noninteractive apt-get install -yqq\
build-essential\
wget\
curl\
mysql-client\
libmysql++-dev\
libmysqlclient15-dev\
checkinstall
RUN wget http://sphinxsearch.com/files/sphinx-${SPHINX_VERSION}.tar.gz && tar xzvf sphinx-${SPHINX_VERSION}.tar.gz && rm sphinx-${SPHINX_VERSION}.tar.gz
RUN cd sphinx-${SPHINX_VERSION} && ./configure --prefix=/usr/local/sphinx
EXPOSE 9306 9312
RUN cd sphinx-${SPHINX_VERSION} && make
RUN cd sphinx-${SPHINX_VERSION} && make install
RUN rm -rf sphinx-${SPHINX_VERSION}
VOLUME /usr/local/sphinx/etc
VOLUME /usr/local/sphinx/var
在学习时非常简单易懂。我正在将 sphinx 构建中的 /etc 和 /var 目录分配给 VOLUME 命令,我认为它可以让我执行-v ~/dev/sphinx/etc:/usr/local/sphinx/etc -v ~/dev/sphinx/var:/usr/local/sphinx/var 之类的操作,但事实并非如此,而是覆盖容器内的目录并将它们留空。当我删除 -v 标志并创建容器时,目录具有预期的文件并且它们不会被覆盖。
这是我在导航到它所在的目录后运行以创建 docker 文件:docker build -t sphinxsearch .
创建完成后,我将执行以下操作以基于该图像创建一个容器:docker run -it --hostname some-sphinx --name some-sphinx --volume ~/dev/docker/some-sphinx/etc:/usr/local/sphinx/etc -d sphinxsearch
我真的很感激任何关于如何让它发挥作用的帮助和见解。我查看了 MySQL 映像,没有看到他们为使目录可绑定所做的任何神奇操作,他们使用了 VOLUME。
提前谢谢你。
【问题讨论】:
-
您确实意识到在 Dockerfile 中,“VOLUME /usr/local/sphinx/etc”与 docker run -v /usr/local/sphinx/etc:/usr/local/ 不同sphinx/etc" 不是吗?前者绕过分层文件系统,后者将其映射到您在主机上选择的路径。通常两者一起使用。
-
是的,我知道这一点。我想从容器访问目录,以便我可以在主机上获取数据。这是我能想到的唯一方法。我在 docker 论坛上发帖并没有得到任何帮助或建议,这是玩弄它并查看无数示例的结果。
标签: docker