Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Docker 在容器中装入目录并与主机共享_Docker - Fatal编程技术网

Docker 在容器中装入目录并与主机共享

Docker 在容器中装入目录并与主机共享,docker,Docker,我以为我懂医生的话,但也许我不懂。我的印象是,-v/HOST/PATH:/CONTAINER/PATH标志是双向的。如果容器中有文件或目录,它们将在主机上镜像,从而使我们能够在删除docker容器后保留目录和文件 在MySQL docker官方图片中,这是可行的。/var/lib/mysql可以绑定到主机,在主机上维护数据的同时,在重新启动和替换容器后仍然有效 我为sphinxsearch-2.2.9编写了一个docker文件,作为练习,为了学习和理解,这里是: FROM debian ENV

我以为我懂医生的话,但也许我不懂。我的印象是,
-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文件时运行的:
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图像,没有看到它们为使目录可绑定所做的任何神奇的事情,它们使用了卷


提前感谢。

将容器目录装载到主机是违反docker概念的。这将打破流程/资源封装原则


另一种方法是将主机文件夹装载到容器中。但是我更愿意建议使用它。

经过无数个小时的研究,我决定用以下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"]
扩展它使我受益匪浅,因为我不必在测试时从头开始构建整个图像,只构建相关的部分

我创建了一个入口点来执行bash脚本,该脚本将文件复制回sphinx正常运行所需的目标,代码如下:

#!/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目录,我可以调整文件,同时在重新启动等期间将其保留在主机上。。。我还有保存在主机上的数据,这些数据应该在重启后仍然有效

我知道关于数据容器与主机上的存储是一个有争议的话题,目前我倾向于在主机上存储,但稍后将尝试另一种方法。如果有人有任何提示、建议等。。。要改进我所拥有的或更好的方法,请分享


感谢@h3nrik提供的建议和帮助

因为mysql在映射之后进行初始化,所以在映射之前,/var/lib/mysql中没有数据

因此,如果您在启动容器之前有数据,-v操作将覆盖您的数据


请参阅entrypoint.sh

它如何与MySQL一起工作,以及如何装载/var/lib/MySQL目录以在主机上持久保存数据?我也想做同样的事情。也许mounting是一个错误的词,如何将一个目录从容器共享到主机,例如一个config目录?只需使用以下命令为
/var/lib/mysql
创建一个卷容器:
docker run-it--name mysqldata-v/var/lib/mysql/bin/true
。然后通过以下链接从mysql服务容器链接到它:
docker run-d——名称mysqlserver——来自mysqldata mysql的卷
。它的行为类似于linux挂载。假设您有一个包含现有文件的目录。然后将一个空磁盘驱动器装入该目录。结果是该目录中存在的文件被挂载“隐藏”,并且该目录看起来是空的。绑定docker卷也会发生类似的情况。因此,不要将卷装入
/etc
等。这将隐藏所有以前存在的配置文件。如果您只想在
/etc
目录中提供一小部分文件,请尽可能使用所述的单文件装载。如果这违反了概念,那么如何在Docker中开发应用程序?如果我在每次代码更改后构建Docker映像,那么它会很慢。如果我在Docker之外运行应用程序,那么它会扼杀Docker的优势。你知道在Docker文件中,“VOLUME/usr/local/sphinx/etc”与Docker run-v/usr/local/sphinx/etc:/usr/local/sphinx/etc不同”“是吗?前者绕过分层文件系统,后者将其映射到您在主机上选择的路径。这两个词经常一起使用。是的,我知道。我想从容器中访问目录,以便在主机上获得数据。这是我能想到的唯一办法。我在docker论坛上发了帖子,但没有得到任何帮助或建议,这是玩它和看无数例子的结果。