Docker: пытаемся понять VOLUME в Dockerfile

Сначала создайте том sample_vol

docker volume create sample_vol

Мой докерфайл

FROM archlinux/base

RUN touch /root/testing  [**edited** find note at RUN below]

# VOLUME sample_vol:/root  [**edited** this will not work, because VOLUME will not accpet named volumes. So this will not mount at /root, it will mount at sample_vol:/root which does not exist]

VOLUME "/root" or VOLUME ["/root"] [**edited** this will create a local mount volume only till the time the container is running. I tried to use named volumes like VOLUME ["name:/root"] but didnt work ]

# RUN touch /root/testing   [**edited** this will not work because volume when mounted will only copy files till it got declared]

создать образ

docker build -t archlinux/sample_vol .

проверка, создан ли тестовый файл в sample_vol

docker run --rm -it -v=sample_vol:/tmp/myvolume archlinux/base ls /tmp/myvolume 

Он не показывает никаких файлов, созданных для тестирования.

пока

$ docker run --rm -it --name sample_vol archlinux/sample_vol ls /root/testing

Он показывает, что файл testing создан в /root/ образа сборки.

Так почему же sample_vol не монтируется в /root, а внутри него создается testing.

Обновление: причина, по которой я обнаружил, может быть связана с

https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#volume

Изменение тома из Dockerfile: если какие-либо шаги сборки изменят данные внутри тома после его объявления, эти изменения будут отменены.


person Santhosh    schedule 15.03.2019    source источник


Ответы (1)


Вы неправильно понимаете docker-volume.

Docker-Image больше касается времени сборки. Docker-Volume полезен только во время выполнения.

Попробуйте запустить следующие команды, чтобы получить представление:

docker run --rm -it -v=sample_vol:/tmp/myvolume archlinux/base touch /tmp/myvolume/1.txt
docker run --rm -it -v=sample_vol:/tmp/myvolume archlinux/base touch /tmp/myvolume/2.txt
docker run --rm -it -v=sample_vol:/tmp/myvolume archlinux/base touch /tmp/myvolume/3.txt
docker run --rm -it -v=sample_vol:/tmp/myvolume archlinux/base ls -altr  /tmp/myvolume/

1-й контейнер создает файл 1.txt в томе докера, смонтированном в /tmp/myvolume, а затем контейнер удаляется после этой операции.
2-й контейнер создает файл 2.txt в томе докера, смонтированном в /tmp/myvolume, а затем контейнер получает удаляется после этой операции.
3-й контейнер создает файл 3.txt в томе докера, смонтированном в /tmp/myvolume, а затем контейнер удаляется после этой операции.
4-й контейнер перечисляет файлы в томе докера, смонтированном в /tmp/myvolume а затем контейнер удаляется после этой операции.

Том Docker предназначен для хранения постоянных данных за пределами жизненного цикла контейнера. Это означает, что когда вы удаляете container , у вас все еще есть данные за пределами контейнера, живущие внутри тома.

Поэтому в следующий раз, если вы создадите контейнер и подключите этот том докера, вы автоматически получите все данные с новым контейнером.

Рассмотрим пример образа базы данных, где вы хотите иметь объем данных, чтобы при смене контейнера на более высокую версию вы получали старые данные в новой базе данных.

person fly2matrix    schedule 15.03.2019
comment
Таким образом, в основном мы должны использовать тома только с помощью -v в команде docker run. Тогда почему у нас есть команда VOLUME в Dokcerfile - person Santhosh; 15.03.2019
comment
На runtime docker-engine автоматически создаст том (если вы не прикрепите его вручную) и прикрепите его к указанному вами месту. - person fly2matrix; 15.03.2019
comment
At runtime docker-engine will automatically creates a volume: to the location that you have mentioned : Вы имеете в виду /root здесь - person Santhosh; 15.03.2019
comment
Вы можете увидеть мой обновленный вопрос в последнем. я думаю причина в этом - person Santhosh; 15.03.2019