Docker заблокирован при установке NPM — тайм-аут сокета

У меня есть простой Dockerfile, на котором запущен узел, вот конфигурация:

FROM node:latest

WORKDIR /usr/src/auth-starter-server

COPY ./ ./

RUN npm install

CMD ["sh"]

Который используется в docker-compose.yml как таковой:

version: "3.8"

services:
  # Node Server
  auth-starter-server:
    container_name: server
    restart: unless-stopped
    build: ./
    command: npm run start:live
    working_dir: /usr/src/auth-starter-server
    ports:
      - "5000:5000"
    volumes:
      - ./:/usr/src/auth-starter-server

Со дня на день случилось так, что я больше не мог строить образ. Заводится без проблем,

Creating network "react-auth-starter_default" with the default driver
Building auth-starter-server
Step 1/5 : FROM node:latest
 ---> 6f7f341ab8b8
Step 2/5 : WORKDIR /usr/src/auth-starter-server
 ---> Using cache
 ---> b25f7c08d3eb
Step 3/5 : COPY ./ ./
 ---> Using cache
 ---> 2a06e76bab32
Step 4/5 : RUN npm install
 ---> Running in 0034d6afa38e

но при сборке с помощью docker-compose up --build (или просто docker build -t auth-starter-server .) просто истекает время ожидания «npm install» и возвращается следующая ошибка:

npm notice 
npm notice New minor version of npm available! 7.0.15 -> 7.3.0
npm notice Changelog: <https://github.com/npm/cli/releases/tag/v7.3.0>
npm notice Run `npm install -g [email protected]` to update!
npm notice 
npm ERR! code ERR_SOCKET_TIMEOUT
npm ERR! errno ERR_SOCKET_TIMEOUT
npm ERR! request to https://registry.companyregistry.com/yargs-parser/-/yargs-parser-13.1.2.tgz failed, reason: Socket timeout

npm ERR! A complete log of this run can be found in:
npm ERR!     /root/.npm/_logs/2020-12-21T15_37_42_509Z-debug.log
ERROR: Service 'auth-starter-server' failed to build : The command '/bin/sh -c npm install' returned a non-zero code: 1

Я заметил, что он не использует официальный реестр npm, хотя он и не установлен в качестве реестра по умолчанию. Вот конфигурация npm (полученная запуском npm config ls -l):

cli configs
long = true
metrics-registry = "https://registry.npmjs.org/"
scope = ""
user-agent = "npm/6.14.9 node/v15.4.0 darwin x64"

; builtin config undefined
prefix = "/usr/local"

; default values
access = null
allow-same-version = false
also = null
always-auth = false
audit = true
audit-level = "low"
auth-type = "legacy"
before = null
bin-links = true
browser = null
ca = null
cache = "/Users/ale917k/.npm"
cache-lock-retries = 10
cache-lock-stale = 60000
cache-lock-wait = 10000
cache-max = null
cache-min = 10
cafile = undefined
cert = null
cidr = null
color = true
commit-hooks = true
depth = null
description = true
dev = false
dry-run = false
editor = "vi"
engine-strict = false
fetch-retries = 2
fetch-retry-factor = 10
fetch-retry-maxtimeout = 60000
fetch-retry-mintimeout = 10000
force = false
format-package-lock = true
fund = true
git = "git"
git-tag-version = true
global = false
global-style = false
globalconfig = "/usr/local/etc/npmrc"
globalignorefile = "/usr/local/etc/npmignore"
group = 20
ham-it-up = false
heading = "npm"
https-proxy = null
if-present = false
ignore-prepublish = false
ignore-scripts = false
init-author-email = ""
init-author-name = ""
init-author-url = ""
init-license = "ISC"
init-module = "/Users/ale917k/.npm-init.js"
init-version = "1.0.0"
json = false
key = null
legacy-bundling = false
link = false
local-address = undefined
loglevel = "notice"
logs-max = 10
; long = false (overridden)
maxsockets = 50
message = "%s"
; metrics-registry = null (overridden)
node-options = null
node-version = "15.4.0"
noproxy = null
offline = false
onload-script = null
only = null
optional = true
otp = null
package-lock = true
package-lock-only = false
parseable = false
prefer-offline = false
prefer-online = false
; prefix = "/usr/local/Cellar/node/15.4.0" (overridden)
preid = ""
production = false
progress = true
proxy = null
read-only = false
rebuild-bundle = true
registry = "https://registry.npmjs.org/"
rollback = true
save = true
save-bundle = false
save-dev = false
save-exact = false
save-optional = false
save-prefix = "^"
save-prod = false
scope = ""
script-shell = null
scripts-prepend-node-path = "warn-only"
searchexclude = null
searchlimit = 20
searchopts = ""
searchstaleness = 900
send-metrics = false
shell = "/bin/zsh"
shrinkwrap = true
sign-git-commit = false
sign-git-tag = false
sso-poll-frequency = 500
sso-type = "oauth"
strict-ssl = true
tag = "latest"
tag-version-prefix = "v"
timing = false
tmp = "/var/folders/2t/36_q44_s62d1b57hnl0l8khw0000gn/T"
umask = 18
unicode = true
unsafe-perm = true
update-notifier = true
usage = false
user = 0
; user-agent = "npm/{npm-version} node/{node-version} {platform} {arch} {ci}" (overridden)
userconfig = "/Users/ale917k/.npmrc"
version = false
versions = false
viewer = "man"

Может ли это быть причиной того, что он прекратил сборку, потому что он указывает на неправильный реестр? И если да, то как это можно исправить?

Немного на стороне, я также заметил предупреждение об обновлении npm; Как я могу обновить пакет npm внутри образа докера?

Любой ответ высоко ценится, поэтому спасибо за ваш вклад!

Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Kubernetes - это портативная, расширяемая платформа с открытым исходным кодом для управления контейнерными рабочими нагрузками и сервисами, которая...
Как создать PHP Image с нуля
Как создать PHP Image с нуля
Сегодня мы создадим PHP Image from Scratch для того, чтобы легко развернуть базовые PHP-приложения. Пожалуйста, имейте в виду, что это разработка для...
9
0
16 836
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Я столкнулся с этой же проблемой и позже понял, что у меня было плохое сетевое соединение, которое вызвало ошибку ERR_SOCKET_TIMEOUT.

Это не из-за Запустите npm install -g [email protected], чтобы обновить!`. Как вы можете видеть ниже, он все еще работает

На самом деле я нашел много других людей с такой же проблемой, и они указывали на проблему с соединением, но это был не тот случай (у меня нет мощного соединения, но его должно быть достаточно для запуска процессов такого типа). ) - Я добавил ответ, который помог мне решить эту конкретную проблему, но все равно большое спасибо за попытку помочь!

ale917k 23.12.2020 10:43

В моем случае это было из-за npm install -g npm удаление помогло

Robert Niestroj 03.02.2022 23:24
Ответ принят как подходящий

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

Это привело к тому, что я не смог обработать установку пакета, так как по какой-то причине мне показалось, что у меня остались зависимости от пользовательского реестра компании.

Чтобы исправить это, я:

  1. Сначала создали разные профили npmrc, чтобы убедиться, что мы используем соответствующий реестр при работе над конкретным проектом — ссылку можно найти здесь

  2. Затем удалили node_modules и package-lock.json, чтобы убрать остатки.

  3. Установите профиль, указывающий на реестр с открытым исходным кодом (https://registry.npmjs.org/) с помощью npmrc <profile>

  4. (Необязательно): проверьте активный профиль реестра, просто запустив npmrc

  5. Переустановил все пакеты с npm install

  6. Восстановите образ докера с помощью docker-compose up --build, и это сделало работу

Надеюсь, это может помочь другим людям в будущем

Как я решил проблему.

Я заметил, что проблема начала проявляться после того, как package-lock.json был исправлен таким образом.

При попытке установить локально на ПК вы получаете:

pm WARN old lockfile 
npm WARN old lockfile The package-lock.json file was created with an old version of npm,
npm WARN old lockfile so supplemental metadata must be fetched from the registry.
npm WARN old lockfile 
npm WARN old lockfile This is a one-time fix-up, please be patient...
npm WARN old lockfile 
....
# installs packages and finish

В докере npm ci тайм-аут истекает.

Решение

NB: Убедитесь, что на вашем ПК установлена ​​последняя версия npm и node.

sudo apt install npm nodejs не режет.

Обновите версию узла:

  • Установить пакеты: sudo apt install npm nodejs
  • Беги: curl -sL https://deb.nodesource.com/setup_14.x | sudo -E bash -
  • Тогда: sudo apt-get install -y nodejs
  • Затем обновите NPM: sudo npm install -g npm@latest

После обновления переустановите пакеты, как показано ниже:

  • Удалить package-lock.json
  • Удалить node_modules
  • Переустановите пакеты с помощью npm install

Теперь запустите свой докер.

Попробуйте добавить tty: true, что-то вроде этого

 backend:
    build: 
      context: ./backend
      dockerfile: Dockerfile
    
    tty: true

у меня та же проблема с базовым образом узла Dockerfile версии 16, поэтому переход на 14 решает проблему вместо «узел: последний» используйте «узел: 14»

Этот! Никогда не было проблем с образом, но на сегодняшний день не удалось создать его локально. Понижение до node:14 помогло

Dmitry Kankalovich 23.03.2022 11:19

Я столкнулся с той же проблемой, и ни одно из вышеперечисленных решений не сработало. Я разрешил это с помощью файла package-lock.json в Dockerfile перед командой RUN npm run install. Таким образом, изменение вышеуказанного Dockerfile, как показано ниже, решило эту проблему.

FROM node:latest
WORKDIR /usr/src/auth-starter-server
COPY package.json ./
COPY package-lock.json ./
RUN npm install
CMD ["sh"]

Я предполагаю, что добавление package-lock.json раньше значительно сокращает время загрузки пакетов и их зависимостей.

Я думаю, вам не хватает, чтобы скопировать все остальное из репо? Кроме того, файл package-lock.json используется только для определения версии всех модулей npm, но вы правы в том, что сначала скопировать только package.json, затем установить, а затем скопировать все остальное более эффективно, чем сформулировано в вопросе

ale917k 16.04.2022 11:25

Я бы предложил немного изменить ваш ответ, чтобы COPY package*.json ., затем RUN npm install, затем COPY . .; Если вы получаете тайм-аут сокета для этого, вы, вероятно, пытаетесь скопировать файлы, которые вы не должны (например, модули узла); Чтобы решить вашу проблему, убедитесь, что в вашем корневом каталоге есть .dockerignore, содержащий node_modules, и все остальное, что, по вашему мнению, не должно передаваться в контейнер.

ale917k 16.04.2022 11:27

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