Почему docker-compose создает пустую папку хоста при монтировании именованного тома? - PullRequest
0 голосов
/ 24 мая 2019

В моем файле docker-compose.yml есть следующее:

volumes:
    - .:/var/www/app
    - my_modules:/var/www/app/node_modules

Я делаю это, потому что у меня нет node_modules на моем хосте, и все устанавливается в образ и находится в /var/www/app/node_modules.

У меня есть два вопроса по этому поводу:

  1. На моем хосте создается пустая папка с именем node_modules.Если я добавлю другой том (именованный или анонимный) в список в моем файле .yml, он отобразится в моем каталоге хоста в той же папке, где находится мой файл .yml.Из этого ответа кажется, что это связано с тем фактом, что эти два отображения происходят одновременно.Однако почему папка пуста на моем хосте?Не должно ли оно либо а) содержать файлы с указанного тома, либо б) вообще не отображаться на хосте?

  2. Как Docker узнает, что проверить базовый /var/www/app/node_modules изобраз при инициализации тома вместо того, чтобы просто сказать «О, node_modules не существует» (поскольку я предполагаю, что монтирование хоста привязки происходит до инициализации именованного тома, следовательно, /var/www/app больше не должно иметь папку с именемnode_modules. Кажется, он работает даже при создании образца папки node_modules на моем хосте и нового тома с сохранением my_modules:/var/www/app/node_modules - кажется, что он все еще использует node_modules из образа, а не с хоста (что не то, что я ожидал, хотя и не нежелательно).

1 Ответ

2 голосов
/ 24 мая 2019

В качестве детали реализации Docker фактически использует средство монтирования файловой системы ядра Linux всякий раз, когда монтирует том. Чтобы смонтировать том, его нужно подключить к каталогу, поэтому, если цель монтирования еще не существует, создается новый пустой каталог, который будет точкой монтирования. Если точка монтирования находится внутри подключенного тома, вы увидите, что пустой каталог создается, но монтирование не будет отображаться.

(Если вы используете хост Linux, попробуйте запустить mount в оболочке во время работы контейнера.)

То есть:

  • /container_root/app - крепление для привязки к /host_path/app; это те же самые файлы.
  • mkdir /container_root/app/node_modules создает /host_path/app/node_modules тоже.
  • Монтирование чего-либо еще на /container_root/app/node_modules не приводит к установке чего-либо на /host_path/app/node_modules.
  • ... который оставляет пустой каталог /host_path/app/node_modules.

Первый раз, когда вы запускаете контейнер , и только тогда, если вы монтируете пустой контейнер в контейнер, содержимое изображения копируется в том. Вы говорите Docker, что этот каталог содержит критические данные , которые должны сохраняться дольше, чем срок службы контейнера. Это не волшебная ручка «не использовать хост-том тома каталога», и если вы делаете такие вещи, как изменение файла package.json, Docker не будет обновлять содержимое этого тома.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...