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