Docker – 从容器挂载目录到主机
我以为我理解文档,但也许我没有。 我的印象是-v /HOST/PATH:/CONTAINER/PATH
标志是双向的。 如果我们在容器中有文件或目录,它们将被镜像到主机上,即使在移除docker容器后,我们仍然可以保留目录和文件。
在官方的MySQL泊坞窗图片中,这是有效的。 可以将/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标志并创build容器时,这些目录具有预期的文件,并且不会被覆盖。
这是我运行后,导航到它所在的目录中docker build -t sphinxsearch .
文件: docker build -t sphinxsearch .
一旦我有了这个创build,我做了以下创build一个基于该映像的容器: docker run -it --hostname some-sphinx --name some-sphinx --volume ~/dev/docker/some-sphinx/etc:/usr/local/sphinx/etc -d sphinxsearch
我真的很感激任何帮助和洞察力如何得到这个工作。 我看了一下MySQL的镜像,没有看到他们做了什么神奇的事情来使目录可以绑定,他们使用了VOLUME。
先谢谢你。
经过无数个小时的研究,我决定用下面的Dockerfile扩展我的镜像:
FROM sphinxsearch VOLUME /usr/local/sphinx/etc VOLUME /usr/local/sphinx/var RUN mkdir -p /sphinx && cd /sphinx && cp -avr /usr/local/sphinx/etc . && cp -avr /usr/local/sphinx/var . ADD docker-entrypoint.sh / RUN chmod +x /docker-entrypoint.sh ENTRYPOINT ["/docker-entrypoint.sh"]
扩展它使我受益匪浅,因为在testing时我不必从头开始构build整个图像,而只是构build相关的部分。
我创build了一个ENTRYPOINT来执行一个bash脚本,将文件复制回所需的目标,以便狮身人面像正常运行,这里是代码:
#!/bin/sh set -e target=/usr/local/sphinx/etc # check if directory exists if [ -d "$target" ]; then # check if we have files if find "$target" -mindepth 1 -print -quit | grep -q .; then # no files don't do anything # we may use this if condition for something else later echo not empty, don\'t do anything... else # we don't have any files, let's copy the # files from etc and var to the right locations cp -avr /sphinx/etc/* /usr/local/sphinx/etc && cp -avr /sphinx/var/* /usr/local/sphinx/var fi else # directory doesn't exist, we will have to do something here echo need to creates the directory... fi exec "$@"
通过访问主机上的/ etc / / var目录,我可以调整文件,同时保持主机在重新启动之间等等。我还将数据保存在主机上,以保持重新启动。
我知道这是一个关于数据容器和主机上存储的争论话题,这时我倾向于在主机上存储,而以后会尝试其他的方法。 如果有人有任何提示,build议等…来改善我有更好的办法,请分享。
谢谢@ h3nrik的build议和提供帮助!
将容器目录挂载到主机上违反了docker的概念。 这将打破过程/资源封装原则。
反过来 – 将一个主文件夹装入一个容器 – 是可能的。 但我宁愿build议使用容器 ,而是。
- 如何在Docker构build之后testing容器或图像?
- docker-machine:无法从主机访问容器的Web服务器
- docker中HOST和NONEnetworking的用途是什么?
- 使用docker-py与'docker exec -it bash <container_id>'进行双向通信
- 连接拒绝在Docker中运行selenium的错误
- 如何在Docker第3部分教程中使用curl -4 http:// localhost?
- Zabbix – 如何降低不支持的项目刷新间隔
- docker可执行文件找不到$ PATH“反应图像
- Docker Dev:Golang:Layer.Size()相当于 layer.Metadata中Metadata.Size的总和。