Почему мое предварительно созданное приложение узла Cloud Foundry пытается получить модули, которые уже находятся в node_modules?

У меня есть предварительно созданное приложение узла, которое не должно пытаться получить доступ к сети, если оно запускается до запуска - цель состоит в том, чтобы все уже присутствовало в каталоге. Он развертывается в облачной среде.

Это не проблема прокси - не должно быть попыток доступа к URL-адресам реестра во время постановки облачного приложения. Я ищу идеи, почему он пытается это сделать.

Когда это приложение развертывается в облачном цеху, даже если оно обнаруживает присутствие каталога во время подготовки, оно все равно пытается получить базовые модули зависимостей (например, @ node / types), которые уже присутствуют, и, конечно же, время ожидания превышает достичь реестра, который не разрешен в этих средах. Есть сотни других зависимостей, которые он не пытается получить, но по какой-то причине считает, что ему нужны некоторые модули. Например:

         2021-03-17T16:29:57.71-0700 [STG/0] OUT        Installing any new modules (package.json + package-lock.json)
   2021-03-17T16:32:31.78-0700 [STG/0] OUT npm ERR! code ECONNREFUSED
   2021-03-17T16:32:31.78-0700 [STG/0] OUT npm ERR! errno ECONNREFUSED
   2021-03-17T16:32:31.79-0700 [STG/0] OUT npm ERR! FetchError: request to https://<registry-fqdn>/@types%2flong failed, reason: connect ECONNREFUSED 10.x.x.x:443
   2021-03-17T16:32:31.79-0700 [STG/0] OUT npm ERR!     at ClientRequest.<anonymous> (/tmp/contents784086672/deps/0/node/lib/node_modules/npm/node_modules/node-fetch-npm/src/index.js:68:14)
   2021-03-17T16:32:31.79-0700 [STG/0] OUT npm ERR!     at ClientRequest.emit (events.js:315:20)
   2021-03-17T16:32:31.79-0700 [STG/0] OUT npm ERR!     at TLSSocket.socketErrorListener (_http_client.js:469:9)
   2021-03-17T16:32:31.79-0700 [STG/0] OUT npm ERR!     at TLSSocket.emit (events.js:315:20)
   2021-03-17T16:32:31.79-0700 [STG/0] OUT npm ERR!     at emitErrorNT (internal/streams/destroy.js:106:8)
   2021-03-17T16:32:31.79-0700 [STG/0] OUT npm ERR!     at emitErrorCloseNT (internal/streams/destroy.js:74:3)
   2021-03-17T16:32:31.79-0700 [STG/0] OUT npm ERR!     at processTicksAndRejections (internal/process/task_queues.js:80:21)
   2021-03-17T16:32:31.79-0700 [STG/0] OUT npm ERR!  FetchError: request to https://<registry-fqdn>/@types%2flong failed, reason: connect ECONNREFUSED 10.x.x.x:443
   2021-03-17T16:32:31.79-0700 [STG/0] OUT npm ERR!     at ClientRequest.<anonymous> (/tmp/contents784086672/deps/0/node/lib/node_modules/npm/node_modules/node-fetch-npm/src/index.js:68:14)
   2021-03-17T16:32:31.79-0700 [STG/0] OUT npm ERR!     at ClientRequest.emit (events.js:315:20)
   2021-03-17T16:32:31.79-0700 [STG/0] OUT npm ERR!     at TLSSocket.socketErrorListener (_http_client.js:469:9)
   2021-03-17T16:32:31.79-0700 [STG/0] OUT npm ERR!     at TLSSocket.emit (events.js:315:20)
   2021-03-17T16:32:31.79-0700 [STG/0] OUT npm ERR!     at emitErrorNT (internal/streams/destroy.js:106:8)
   2021-03-17T16:32:31.79-0700 [STG/0] OUT npm ERR!     at emitErrorCloseNT (internal/streams/destroy.js:74:3)
   2021-03-17T16:32:31.79-0700 [STG/0] OUT npm ERR!     at processTicksAndRejections (internal/process/task_queues.js:80:21) {
   2021-03-17T16:32:31.79-0700 [STG/0] OUT npm ERR!   type: 'system',
   2021-03-17T16:32:31.79-0700 [STG/0] OUT npm ERR!   errno: 'ECONNREFUSED',
   2021-03-17T16:32:31.79-0700 [STG/0] OUT npm ERR!   code: 'ECONNREFUSED',
   2021-03-17T16:32:31.79-0700 [STG/0] OUT npm ERR!   parent: 'app'
   2021-03-17T16:32:31.79-0700 [STG/0] OUT npm ERR! }
   2021-03-17T16:32:31.79-0700 [STG/0] OUT npm ERR!
   2021-03-17T16:32:31.79-0700 [STG/0] OUT npm ERR! If you are behind a proxy, please make sure that the
   2021-03-17T16:32:31.79-0700 [STG/0] OUT npm ERR! 'proxy' config is set properly.  See: 'npm help config'
   2021-03-17T16:39:12.54-0700 [STG/0] OUT npm ERR! A complete log of this run can be found in:
   2021-03-17T16:39:12.54-0700 [STG/0] OUT npm ERR!     /home/vcap/.npm/_logs/2021-03-17T23_32_31_800Z-debug.log
   2021-03-17T16:39:12.56-0700 [STG/0] OUT        **ERROR** Unable to build dependencies: exit status 1
   2021-03-17T16:39:13.07-0700 [STG/0] ERR Failed to compile droplet: Failed to run all supply scripts: exit status 14
   2021-03-17T16:39:13.09-0700 [STG/0] OUT Exit status 223
   2021-03-17T16:39:13.28-0700 [STG/0] OUT Cell 5cee670a-6f6c-4510-a274-5584f197038c stopping instance 59dda306-be2f-4d08-830c-77c08ffab3f5
   2021-03-17T16:39:13.28-0700 [STG/0] OUT Cell 5cee670a-6f6c-4510-a274-5584f197038c destroying container for instance 59dda306-be2f-4d08-830c-77c08ffab3f5
   2021-03-17T16:39:13.76-0700 [API/1] ERR Failed to stage build: staging failed

Есть идеи?

Редактировать #1 Другие факты:

  1. приложение помещается в виде zip-архива
  2. файловая система zip включает node_modules каталог, полученный в результате npm install команда, запускаемая во время "сборки", чтобы создать zip-архив
  3. файловая система zip включает package-lock.json (из источника)
  4. здесь нет .cfignore файл в любом месте zip-архива
  5. zip 'build' раньше выполнялся на машине с Windows, и ранее не было этой проблемы при последующем нажатии на cf
  6. zip 'build' недавно перенесен на gitlab ci runner из кластера k8s, который может использовать образ, производный от centos
  7. версия узла (14.14.0) на машине сборки соответствует версии, используемой buildpack, но версия npm (7.6.1) нет (buildpack использует 6.14.8)
  8. изменение образа сборки, в котором собран zip, на Ubuntu Bionic Beaver (18.04.4 LTS) не имеет значения

2 ответа

Не уверен на 100%, что это решит проблему, но вот то, что я видел, как правило, сбивает с толку людей, пытающихся продавать зависимости Node.js:

Сначала просмотрите инструкции из документации: https://docs.cloudfoundry.org/buildpacks/node/index.html#vendoring

  1. Беги (ты это сделал)
  2. Убедитесь, что у вас есть файл (возможно, он у вас есть). Это блокирует используемые версии и должно гарантировать, что то, что находится, совпадает с тем, что будет установлено. Если у вас этого нет, вы увидите Warning: package-lock.json not found. вывод из buildpack.
  3. Убедитесь, что вы отжимаетесь package.json, package-lock.json, и полный каталог вместе со всем кодом вашего приложения.

Они не задокументированы, но некоторые советы из того, что я наблюдал, работая с другими над этим:

  1. Убедитесь, что у вас нет .cfignoreфайл, так как это может случайно привести к тому, что он не будет отправлен. Обычно вы можете сказать, не отправляется ли это, потому что количество файлов и размер того, что отправляется, будут намного, намного больше с этим. Вы также увидите сообщение It is recommended to vendor the application's Node.js dependencies если каталог не существует.

  2. Когда вы запускаете локально, вам нужно запускать его в виртуальной машине или контейнере Ubuntu Bionic. Это связано с тем, что NPM часто устанавливает модули, для которых требуется собственный код. Он автоматически справится с этим, но что в node_modules/специфичен для ОС и архитектуры, в которой вы работаете. Таким образом, если вы запустите npm installв ОС, отличной от Ubuntu Bionic (скажем, Windows или MacOS), он скомпилирует собственный код для вашей локальной машины. Когда вы нажмете это, он не будет соответствовать, и NPM попытается переустановить пакет, который может инициировать доступ в Интернет.

  3. Убедитесь, что вы используете последнюю версию пакета сборки Node.js и версию Node.js. Всегда полезно иметь последний код с исправлениями ошибок.

  4. NODE_ENV=productionбудет устанавливаться пакетом сборки, и это иногда может вызвать разницу в поведении. Он также пропускает установку зависимостей разработчика. Вряд ли проблема здесь, но стоит упомянуть, поскольку это сбивает с толку некоторых людей.

Оказалось, что эта проблема вызвана несоответствием версий npm на машине, на которой создается файл, машине, на которой каталог заполнен для включения в zip-дистрибутив (npm v7.x), и тем, что использует пакет сборки облачного литейного цеха (npm v6.x).

Изменение машин разработки и сборки на использование npm v6.x для генерации как package-lock.json файл и заполните node_modules каталог привел к успешно поставленному приложению nodejs.

Другие вопросы по тегам