gpt4 book ai didi

docker - 在Container中挂载目录并共享给Host

转载 作者:太空宇宙 更新时间:2023-11-04 12:05:50 26 4
gpt4 key购买 nike

我以为我理解文档,但也许我没有。我的印象是 -v/HOST/PATH:/CONTAINER/PATH 标志是双向的。如果我们在容器中有文件或目录,它们将被镜像到主机上,这让我们即使在删除 docker 容器后也能保留目录和文件。

在官方 MySQL docker 镜像中,这是可行的。 /var/lib/mysql 可以绑定(bind)到主机,并在重启和更换容器后仍然存在,同时维护主机上的数据。

我为 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 图像,没有看到他们为使目录可绑定(bind)而做了任何神奇的事情,他们使用了 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 的建议和帮助!

关于docker - 在Container中挂载目录并共享给Host,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50780431/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com