当前位置: 首页 > 面试题库 >

在Container中挂载目录并与主机共享

姬高澹
2023-03-14
问题内容

我以为我了解文档,但也许我听不懂。我的印象是该-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 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扩展映像:

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"]

对其进行扩展使我受益匪浅,因为我在测试时不必从头开始构建整个图像,而只需构建相关的部分。

我创建了一个ENTRYPOINT来执行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的建议和帮助!



 类似资料:
  • 挂载主机目录 挂载一个主机目录作为数据卷 使用 --mount 标记可以指定挂载一个本地主机的目录到容器中去。 $ docker run -d -P \ --name web \ # -v /src/webapp:/opt/webapp \ --mount type=bind,source=/src/webapp,target=/opt/webapp \ training/

  • 问题内容: 我有一个正在进行dockerizing的开发环境,并且我希望能够实时重新加载所做的更改而不必重建docker映像。我使用docker compose是因为redis是我应用程序的依赖项之一,我喜欢能够链接redis容器 我在我的中定义了两个容器: 我已经到了我应用程序的dockerfile中添加卷的地步,但是如何将主机的目录挂载到卷中,以便对代码的所有实时编辑都可以反映在容器中? 这是

  • 本文向大家介绍linux mount挂载共享目录详解,包括了linux mount挂载共享目录详解的使用技巧和注意事项,需要的朋友参考一下 挂载windows共享目录或FTP: 方式一:包含密码 方式二:密码单独输入 卸载: 挂载linux共享目录: 【修改server端】 修改/etc/export文件,加入: 执行如下命令是新增的共享生效 【客户端】执行如下命令挂载共享: 设置开机启动自动挂载

  • 为了方便使用 windows 共享的目录,最好能直接 mount 进来。 安装 需要安装 cifs-utils: apt-get install cifs-utils 挂载 使用 mount 命令装载: sudo mkdir /mnt/nas/d sudo mount -t cifs -o rw,username=sky,password=***,uid=1000,gid=1000 //192.1

  • 问题内容: 在Docker容器中挂载主机目录非常容易。 但是我需要另一种方式。 我使用Docker容器作为开发环境来开发WordPress插件。该Docker容器包含运行WordPress所需的一切(MySQL,Apache,PHP和WordPress)。我从Docker容器中的主机挂载了我的插件src文件夹,以便可以在开发期间测试我的插件。 对于调试,如果我在主机上运行的IDE具有对Docker

  • 假设我有一个应用程序具有这个简单的DockerFile: 然后我运行了一个容器: 所以它工作正常,并将一些日志存储在docker容器的中。 我也看到docker-mount目录从容器到主机,但它并没有解决我的问题我需要一种方法备份我的文件从Docker到主机。