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

106

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

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

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

радий226
источник
1
связанные: stackoverflow.com/a/46992367/3160529
Шубхам

Ответы:

70

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

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

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

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

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

См. « Docker - Как получить доступ к тому, не прикрепленному к контейнеру? ».
С помощью docker volume create легко повторно прикрепить именованный том к контейнеру.

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

# let's mount aname volume again
docker run -v aname:/apath --name acontainer
ls /apath
# you find your data back!
VonC
источник
2
Допустим, вы используете Dockerfilewith VOLUMEи -v /path:/host_path/флаг. Содержимое VOLUMEбудет заменено содержимым /host_path/?
radium226
Благодаря вам @VonC, думаю, я понял :) А если вы сделаете a, docker volume create --name my_volumeза которым следует a docker run --volume-from my_volume, как узнать, где будет точка монтирования?
radium226
@ radium226 нет точки монтирования (то есть ничего не смонтировано с хоста, кроме собственного пустого / var / lib / docker / volume). Путь к тому находится в метаданных my_volume: stackoverflow.com/a/31997267/6309
VonC
Я так понимаю, что на стороне хоста нет точки монтирования. Но docker run ...как я могу записать в файл, хранящийся на my_volumeтоме, в запущенном контейнере ? Я не знаю ... пути? объема внутри моего работающего контейнера, потому что я ничего не определил? Надеюсь, я достаточно ясен, потому что я определенно не уверен в своем голосе: - /
radium226
1
@ radium226 docker volume create --name anameсоздает именованный том: вы назначаете путь к контейнеру во время выполнения:: к docker run -v aname:/apathэтому контейнеру теперь прикреплен том, подключенный к его папке / apath. Я переписал ответ, чтобы прояснить это.
VonC
11

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папке.

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

Корай Тугай
источник
Тома будут удалены, потому что это анонимные тома И вы запустили контейнеры с --rmопцией. Я думаю, упоминание об этом может сработать. Если вы не запускали контейнер с помощью --rm, вы все равно можете удалить контейнер и его анонимные тома с помощью docker rm -v my-container.
AymDev