Подтвердить что ты не робот

Какова цель VOLUME в Dockerfile

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

  • Команда docker volume create
  • docker run -v /path:/host_path
  • Запись VOLUME в файле Dockerfile

Я особенно не понимаю, что произойдет, если вы объедините запись VOLUME с флагом -v.

4b9b3361

Ответ 1

Том - это постоянные данные, хранящиеся в /var/lib/docker/volumes/...

  • Вы можете объявить его в Dockerfile, что означает, что каждый раз, когда контейнер запускается из образа, том создается (пустой), даже если у вас нет опции -v.

  • Вы можете объявить это во время выполнения docker run -v [host-dir:]container-dir.
    объединение двух (VOLUME + docker run -v) означает, что вы можете подключить содержимое папки хоста в том, сохраненный контейнером в /var/lib/docker/volumes/...

  • docker volume create создает том без необходимости определять файл Docker, создавать образ и запускать контейнер. Он используется для быстрого подключения других контейнеров к указанному объему.

Если вы сохранили некоторое содержимое в томе, но с тех пор удалили контейнер (который по умолчанию не удаляет связанный с ним том, если вы не используете docker rm -v), вы можете повторно присоединить указанный том к новому контейнеру ( объявив такой же объем).

См. "Докер. Как получить доступ к тому, который не прикреплен к контейнеру?".
С помощью создания тома Docker легко присоединить именованный том к контейнеру.

docker volume create --name aname
docker run -v aname:/apath --name acontainer
...
# modify data in /apath
...
docker rm acontainer

# let mount aname volume again
docker run -v aname:/apath --name acontainer
ls /apath
# you find your data back!

Ответ 2

Инструкция VOLUME становится интересной, когда вы комбинируете ее с параметром времени выполнения volumes-from.

Учитывая следующий Dockerfile:

FROM busybox
VOLUME /myvolume

Создайте изображение с помощью:

docker build -t my-bb .

И раскрутите контейнер с помощью:

docker run --rm -it --name my-first-bb my-bb

Первое, на что нужно обратить внимание, - на этом изображении у вас будет папка с именем myvolume. Но это не особенно интересно, так как при выходе из контейнера объем также будет удален.

Создайте пустой файл в этой папке, поэтому запустите в контейнере следующее:

cd myvolume
touch hello.txt

Теперь раскрутите новый контейнер, но поделитесь тем же объемом с my-first-bb:

docker run --rm -it --volumes-from my-first-bb --name my-second-bb my-bb

Вы увидите, что my-second-bb содержит файл hello.txt в папке myvolume.

Как только вы выйдете из обоих контейнеров, ваш объем также будет удален.