npm WindowsLinuxmacOSNode.jsnpm

npm: При запуске npm в Docker не виден volume с зависимостями

  • Обновлено
  • Чтение ≈ 3 минуты

Краткий ответ

При работе через Docker контейнер может не видеть node_modules, хотя пакеты установлены в образе или на компьютере. Типичные причины — bind mount поверх каталога приложения, отдельный volume, несовпадающий рабочий каталог либо установка в другую стадию сборки.

В этой статье
  1. Как проявляется ошибка и когда применим способ
  2. Причины и признаки
  3. Пошаговая диагностика и решение
  4. Проверка результата и действия при повторении

#Как проявляется ошибка и когда применим способ

При работе через Docker контейнер может не видеть node_modules, хотя пакеты установлены в образе или на компьютере. Типичные причины — bind mount поверх каталога приложения, отдельный volume, несовпадающий рабочий каталог либо установка в другую стадию сборки.

#Причины и признаки

Возможная причинаКак узнатьЧто делать
Подключённый том скрывает файлы образаbind mount перекрывает путь, содержащий node_modules в собранном образе.В docker image содержимое есть, но внутри запущенного контейнера нет.Сопоставить mounts, WORKDIR и расположение зависимостей.
Установка в другом каталогеnpm ci выполнен не там, где расположен package.json в рабочем процессе.docker exec показывает разные package.json и cwd.Исправить рабочую директорию и конфигурацию томов.

#Пошаговая диагностика и решение

  1. 1. Найдите контейнер и его рабочий каталогНа компьютере с Docker выполните docker ps и найдите нужное имя или ID. Затем посмотрите рабочий каталог процесса через docker exec без изменения состояния. Если контейнер не запущен, изучите docker compose config и журнал запуска, не удаляя контейнер или тома.
    Linux · Терминал (Bash)Команда
    Замените имя работающего контейнера; требуется доступ к Docker, который фактически даёт широкие привилегии.
    docker ps
    docker exec ИМЯ_КОНТЕЙНЕРА pwd
  1. 2. Посмотрите, какие точки монтирования активныВыполните docker inspect для своего контейнера, найдите поле Mounts: Destination, Source и Type. Если том направлен поверх /app или /app/node_modules, он может скрывать файлы, записанные при сборке образа. Не удаляйте volume: в нём могут находиться важные данные.
    Linux · Терминал (Bash)Команда
    Читает сведения о подключённых томах. Данные о путях могут быть конфиденциальны.
    docker inspect ИМЯ_КОНТЕЙНЕРА --format "{{json .Mounts}}"
  1. 3. Проверьте существование зависимостей внутриПодставьте настоящий рабочий путь из Dockerfile/Compose и проверьте наличие package.json и node_modules внутри контейнера. Если образ основан на минимальной оболочке без sh, используйте команду docker exec с исполняемым файлом, который реально присутствует. Никакие файловые операции сейчас не выполняйте.
    Linux · Терминал (Bash)Команда
    Только если в образе есть sh и ls; работает в настроенном WORKDIR.
    docker exec ИМЯ_КОНТЕЙНЕРА sh -c "pwd; ls -ld package.json node_modules"
  1. 4. Сверьте Dockerfile с конфигурацией ComposeОткройте Dockerfile и compose.yaml в редакторе. Сопоставьте WORKDIR, COPY package*.json, RUN npm ci, COPY проекта и volumes. Если bind mount исходного каталога перекрывает node_modules, выберите отдельную безопасную стратегию хранения зависимостей, соответствующую проекту.
  1. 5. Проверьте предложенную структуру на копииВ копии compose.yaml сделайте тестовый сервис с необходимым mount и отдельным именованным томом для node_modules, если это соответствует архитектуре. Не используйте этот приём для production автоматически: с устаревшим томом внутри останется старая версия пакетов. Выполните тестовую сборку и проверьте установленное дерево.
  1. 6. Проверьте установленную версию через npm lsЗапустите npm ls внутри тестового контейнера из рабочей папки. Если пакет отсутствует, настройка монтирования не решена; если указан корректный пакет, повторите тестовое npm run. После успеха верните старый compose.yaml или перенесите проверенную конфигурацию через обычную процедуру выпуска.
  2. Читает список пакетов внутри контейнера
    Linux · Терминал (Bash)Команда
    Читает список пакетов внутри контейнера. npm должен быть установлен в образе.
    docker exec ИМЯ_КОНТЕЙНЕРА npm ls --depth=0

#Проверка результата и действия при повторении

В тестовом контейнере нужные пакеты видны по пути, указанному WORKDIR, и npm ls отображает ожидаемые версии. Контейнер может быть пересоздан без потери зависимостей; изменение состава томов не уничтожает постоянные данные.

Если на указанном шаге результат отличается, остановитесь и запишите первое полное сообщение об ошибке, версию инструментов и проверенное состояние до исправления. Не переходите к опасным действиям на действующем проекте: повторите проверку на отдельной копии, верните сохранённые файлы и только затем выбирайте следующую причину.

Так эту ошибку тоже называют

Источники и обновления

Последнее обновление статьи: 2 ноября 2026. Версии программ и интерфейсы меняются — если шаги не совпадают с вашей версией, сверяйтесь с документацией производителя.