Почему мое предварительно созданное приложение узла 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 Другие факты:
- приложение помещается в виде zip-архива
- файловая система zip включает
node_modules
каталог, полученный в результатеnpm install
команда, запускаемая во время "сборки", чтобы создать zip-архив - файловая система zip включает
package-lock.json
(из источника) - здесь нет
.cfignore
файл в любом месте zip-архива - zip 'build' раньше выполнялся на машине с Windows, и ранее не было этой проблемы при последующем нажатии на cf
- zip 'build' недавно перенесен на gitlab ci runner из кластера k8s, который может использовать образ, производный от centos
- версия узла (14.14.0) на машине сборки соответствует версии, используемой buildpack, но версия npm (7.6.1) нет (buildpack использует 6.14.8)
- изменение образа сборки, в котором собран zip, на Ubuntu Bionic Beaver (18.04.4 LTS) не имеет значения
2 ответа
Не уверен на 100%, что это решит проблему, но вот то, что я видел, как правило, сбивает с толку людей, пытающихся продавать зависимости Node.js:
Сначала просмотрите инструкции из документации: https://docs.cloudfoundry.org/buildpacks/node/index.html#vendoring
- Беги (ты это сделал)
- Убедитесь, что у вас есть файл (возможно, он у вас есть). Это блокирует используемые версии и должно гарантировать, что то, что находится, совпадает с тем, что будет установлено. Если у вас этого нет, вы увидите
Warning: package-lock.json not found.
вывод из buildpack. - Убедитесь, что вы отжимаетесь
package.json
,package-lock.json
, и полный каталог вместе со всем кодом вашего приложения.
Они не задокументированы, но некоторые советы из того, что я наблюдал, работая с другими над этим:
Убедитесь, что у вас нет
.cfignore
файл, так как это может случайно привести к тому, что он не будет отправлен. Обычно вы можете сказать, не отправляется ли это, потому что количество файлов и размер того, что отправляется, будут намного, намного больше с этим. Вы также увидите сообщениеIt is recommended to vendor the application's Node.js dependencies
если каталог не существует.Когда вы запускаете локально, вам нужно запускать его в виртуальной машине или контейнере Ubuntu Bionic. Это связано с тем, что NPM часто устанавливает модули, для которых требуется собственный код. Он автоматически справится с этим, но что в
node_modules/
специфичен для ОС и архитектуры, в которой вы работаете. Таким образом, если вы запуститеnpm install
в ОС, отличной от Ubuntu Bionic (скажем, Windows или MacOS), он скомпилирует собственный код для вашей локальной машины. Когда вы нажмете это, он не будет соответствовать, и NPM попытается переустановить пакет, который может инициировать доступ в Интернет.Убедитесь, что вы используете последнюю версию пакета сборки Node.js и версию Node.js. Всегда полезно иметь последний код с исправлениями ошибок.
NODE_ENV=production
будет устанавливаться пакетом сборки, и это иногда может вызвать разницу в поведении. Он также пропускает установку зависимостей разработчика. Вряд ли проблема здесь, но стоит упомянуть, поскольку это сбивает с толку некоторых людей.
Оказалось, что эта проблема вызвана несоответствием версий npm на машине, на которой создается файл, машине, на которой каталог заполнен для включения в zip-дистрибутив (npm v7.x), и тем, что использует пакет сборки облачного литейного цеха (npm v6.x).
Изменение машин разработки и сборки на использование npm v6.x для генерации как
package-lock.json
файл и заполните
node_modules
каталог привел к успешно поставленному приложению nodejs.