Вы правы, ваш процесс построения образа устанавливает пакеты узлов в каталог node_modules
в образе.Итак, после создания образа образ содержит node_modules
, и вы можете использовать его для запуска приложения.
Вы видите node_modules
на своем хост-компьютере из-за настроек томов в файле Compose.Однако есть нечто большее, чем вы видите в другом ответе.
То, что происходит, заключается в том, что вы отображаете .:/usr/app
в своем первом определении тома, что означает, что вы отображаете текущий каталог на хосте в /usr/app
в контейнере.
Это заменит каталог /usr/app
в образе текущим каталогом на хосте.И у вашего хоста нет каталога node_modules
(если только вы не установили на нем также node_modules), и, следовательно, ваш контейнер не будет работать с этим отображением, потому что вы переопределили /usr/app
и нет директивы node_modules
впереопределение. Узел выдаст ошибку, что он не может найти модули узла.
Следующее сопоставление тома решает ситуацию, на самом деле это обычная настройка разработки узла.Вы создаете том /usr/app/node_modules
.Обратите внимание, что у этого тома нет хост-части, в отображении нет :
, здесь только один каталог.Это означает, что Docker смонтирует каталог /usr/app/node_modules
из образа и добавит его в предыдущее сопоставление, где вы установили каталог хоста в /usr/app
.
Таким образом, в работающем контейнере вы получите исходный код из текущего каталога хоста PLUS node_modules
из базового образа благодаря двойному отображению.
В качестве побочного эффекта вы увидите пустой каталог node_modules
в текущем каталоге вашего хоста.