2016-03-08 10 views
2

У меня есть dockerfile что-то вроде:Dockerfile; Докер строить объемы: изменения объема через ADD или CO не отбрасывается

VOLUME /tmp/space 
ADD local/directory/ /tmp/space/ 
RUN cp /tmp/space/somescript.sh /opt/real/space/ 

После того, как контейнер построен, и я получаю интерактивную оболочку я замечаю, что/TMP/пространства все еще содержит данные из локального/каталога.

Если я добавлю RUN rm -rf /tmp/space/* в конец файла dockerfile и получаю доступ к оболочке. Данные все еще присутствуют в/tmp/space /.

В результате я оставил выполнение контейнера с использованием того же тома, а затем передал измененный контейнер обновленному изображению.

Есть ли способ во время сборки иметь временно загруженный том, который не раздувает результирующее изображение?

Целью является использование исходных файлов и скриптов для выполнения некоторых действий во время сборки. Слои докера заканчиваются записью дубликата этапа COPY/ADD с шагом RUN. Поэтому было бы лучше COPY данные в пространство, которое не записывается как слой, а затем как один шаг RUNcp stuff && execute scripts, чтобы сэкономить на пространстве.

+0

То, что я в конечном итоге делает это с помощью COPY для всей локальной папки и сохранения файла dockerignore пропустить файлы, которые мне не нужны в полученном изображении. Не идеально, но это в конечном итоге спасает меня около 200 МБ пространства. –

ответ

0

Я не уверен, что вы пытаетесь сделать здесь: VOLUME/TMP/пространство - это объявляет точку монтирования и отображения/TMP/место на контейнере в каталог на хосте

ADD/локальный/directory/tmp/space - Я думаю, что вы пытаетесь скопировать локальный каталог из вашего контейнера в установленный том

RUN cp/tmp/space/*/opt/real/space/- Вы пытаетесь скопировать из ваш объем для вашего хоста?

После добавления директивы VOLUME в dockerfile, что происходит, является то, что папка в контейнере /TMP/пространство отображается в папку на хосте, скажем /hosttmp/hostspace. Вы можете узнать, что это на хосте, выполнив команду -

$ docker inspect -f {{.Volumes}} <your_container_name> 

В целях предотвращения повреждения данных в /hosttmp/hostspace, когда-ОБЪЕМ объявлен в dockerfile, вы не можете играть вокруг с содержимым.

Я рекомендовал бы читать эту статью, как это объясняет довольно запутанным понятию громкости докер

http://container-solutions.com/understanding-volumes-docker/

+0

Я отредактировал вопрос, чтобы попытаться прояснить, что я пытаюсь сделать. Проблема, с которой я сталкиваюсь, заключается в том, что VOLUME не отображает локальную папку для команд ADD и COPY в файле docker (работает докер 1.9.1 на момент написания). –

+0

Вам нужно переместить команду VOLUME в конец файла докера. Это после того, как вы выполнили какие-либо команды ADD или COPY в этой папке. Последним шагом должно быть его установка i.e VOLUME – noobuntu

+0

Но я пытаюсь использовать файлы во время процесса сборки и не иметь их в конечном результате. Я хочу VOLUME перед ADD или COPY, чтобы эти файлы не находились в полученном изображении. –