2015-07-30 4 views
14

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

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

Я написал файл Docker для 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 после навигации в каталог, в котором он находится: 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.

Заранее спасибо.

+0

Вы понимаете, что в файле Docker «VOLUME/usr/local/sphinx/etc» не совпадает с запуском docker -v/usr/local/sphinx/etc:/usr/local/sphinx/etc »don Вы не согласны с тем, что предыдущий обходит многоуровневую файловую систему, а затем отображает ее на путь по вашему выбору на хосте. Часто оба используются вместе. – Matt

+0

Да, я знал об этом. Я хотел получить доступ к каталогам из контейнера, поэтому что я могу иметь данные на хосте. Это был единственный способ, которым я мог подумать, как это сделать. Я опубликовал на форумах докеров и не получал никакой помощи или совета, это было результатом игры с ним и глядя на бесчисленные примеры. –

ответ

10

После бесчисленных часов исследований, я решил расширить свое изображение со следующим 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 выполнить Баш скрипт, который будет копировать файлы обратно до требуемого назначения для сфинкс, чтобы работать должным образом, в том, что код:

#!/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 "[email protected]" 

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

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

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

1

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

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

+0

Как это работает с MySQL и монтированием каталога/var/lib/mysql для сохранения данных на хосте? Я хотел бы сделать то же самое. –

+0

Возможно, это неправильное слово, каталог из t он контейнер для хоста, например, каталог конфигурации? –

+1

Просто создайте контейнер тома для '/ var/lib/mysql' с помощью:' docker run -it -name mysqldata -v/var/lib/mysql mysql/bin/true'. Затем подключитесь к нему из своего контейнера службы mysql через: 'docker run -d --name mysqlserver --volumes-from mysqldata mysql'. – h3nrik

Смежные вопросы