Вот как работают крепления. Они монтируют одну папку в другой путь в файловой системе. Весь доступ к целевому пути отображается непосредственно обратно в исходный каталог.
То, что docker предоставляет для именованного тома (ваш второй пример), является этапом инициализации, когда этот именованный том пуст при создании контейнера. Они будут копировать все файлы, каталоги и метаданные, такие как владелец файла и разрешения, из файловой системы образа в указанный том перед запуском контейнера. Это происходит только с именованными томами, а не с монтируемыми хостами или томами tmpfs. И это происходит только тогда, когда именованный том пуст, поэтому он не будет обновляться при изменении образа.
Вы можете создать именованный том, который монтирует другие каталоги на хосте, передавая дополнительные параметры, давая вы что-то между монтированием хоста и именованным томом по умолчанию, поскольку они оба реализованы с монтированием bind. Ниже приведены три различных примера:
# create the volume in advance
$ docker volume create --driver local \
--opt type=none \
--opt device=/home/user/test \
--opt o=bind \
test_vol
# create on the fly with --mount
$ docker run -it --rm \
--mount type=volume,dst=/container/path,volume-driver=local,volume-opt=type=none,volume-opt=o=bind,volume-opt=device=/home/user/test \
foo
# inside a docker-compose file
...
volumes:
bind-test:
driver: local
driver_opts:
type: none
o: bind
device: /home/user/test
...
Если ваша цель - упростить работу других пользователей образа и потенциально обновить том новыми версиями образа, то вы Я хочу сделать это как часть вашего сценария точки входа. Я делаю это в моих скриптах кеширования томов , включенных в базовый образ. Вы копируете каталог тома в безопасное место внутри образа, а затем при запуске контейнера сценарий точки входа копирует файлы в том.