Docker - Руководство по каталогу от контейнера до хоста

Я думал, что понял документы, но, возможно, я этого не сделал. У меня создалось впечатление, что флаг -v /HOST/PATH:/CONTAINER/PATH двунаправлен. Если у нас есть файл или каталоги в контейнере, они будут зеркалированы на хосте, что даст нам возможность сохранить каталоги и файлы даже после удаления контейнера докеров.

В официальных изображениях докеры MySQL это работает. /var/lib/mysql может быть привязан к хосту и выжить перезагрузки и замены контейнера, сохраняя данные на хосте.

Я написал файл докеров для sphinxsearch-2.2.9 как практику и ради обучения и понимания, вот он:

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

Очень просто и легко получить голову, обернутую во время обучения. Я назначаю директории /etc и/var из сборки sphinx команде 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.

Спасибо заранее.

Ответ 1

После бесчисленных часов исследований я решил расширить свое изображение с помощью следующего файла Docker:

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 script, который скопировал бы файлы обратно в требуемый пункт назначения для правильной работы 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 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 "[email protected]"

Доступ к каталогам /etc и/var на хосте позволяет мне настроить файлы, сохраняя их на хосте между перезапусками и т.д.... У меня также есть данные, сохраненные на хосте, которые должны выжить перезагрузки.

Я знаю, что это обсуждаемая тема для контейнеров данных и хранения на хосте, в данный момент я склоняюсь к хранению на хосте, но позже попробую другой метод. Если у кого-нибудь есть советы, советы и т.д., Чтобы улучшить то, что у меня есть или лучше, пожалуйста, поделитесь.

Спасибо @h3nrik за предложения и за помощь!

Ответ 2

Установка каталогов контейнеров на хост против концепций докеров. Это нарушит принцип инкапсуляции процесса/ресурсов.

В другом месте - установка папки хоста в контейнер - возможно. Но я предпочел бы вместо этого использовать контейнеры тома.