docker npm install Ошибка: getaddrinfo ENOTFOUND registry.npmjs.org registry.npmjs.org:443
Я использую Docker версии 1.10.1 на RHEL 7 и получаю ошибку установки npm при использовании ниже Dockerfile. Ошибка: getaddrinfo ENOTFOUND registry.npmjs.org registry.npmjs.org:443. Такая же работа с докером 1.91 на убунту 14.04. Когда я получил bash и установил inetutils-ping на контейнер, я заметил, что нигде не могу ping
root@9deb4b274c1e:/home/nodexp#ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8): 56 data bytes
^C--- 8.8.8.8 ping statistics ---
4 packets transmitted, 0 packets received, 100% packet loss
Это почему? Конечно я могу пинговать от RHEL
Dockerfile
FROM node:argon
# Create user nodexp in group nodexp
RUN groupadd -r nodexp \
&& useradd -m -r -g nodexp nodexp
WORKDIR /home/nodexp
# Install app dependencies
COPY package.json /home/nodexp
RUN npm install
# Bundle app source
COPY . /home/nodexp
EXPOSE 3000
CMD [ "npm", "start" ]
и package.json
{
"name": "mp",
"version": "0.0.0",
"private": true,
"scripts": {
"start": "node app.js"
},
"dependencies": {
"express": "~4.13.1"
}
}
3 ответа
Перезапуск докера с этой командой исправляет это для меня, но я не знаю почему
sudo service docker restart
Я исправляю эту проблему на основе этой статьи https://development.robinwinslow.uk/2016/06/23/fix-docker-networking-dns/
на самом деле, вы можете проверить DNS, если он не работает или нет во время вызова registry.npmjs.org
Чтобы проверить это, я сделал эти шаги, чтобы заставить это работать
Шаг 1
Запустите эту команду на busybox
изображение, я буду использовать google.com для имитации запроса на подключение
>> docker run busybox nslookup google.com
Unable to find image 'busybox:latest' locally
latest: Pulling from library/busybox
f70adabe43c0: Pull complete
Digest: sha256:58ac43b2cc92c687a32c8be6278e50a063579655fe3090125dcb2af0ff9e1a64
Status: Downloaded newer image for busybox:latest
nslookup: can't resolve 'google.com'
Server: 8.8.8.8
Address 1: 8.8.8.8
Шаг 2
Как видно из шага 1, я получил ошибку и не могу разрешить соединение с google.com
, если вы получили похожую ошибку, то сделайте это, чтобы проверить текущий маршрут DNS.
>> nmcli dev show | grep 'IP4.DNS'
IP4.DNS[1]: 192.168.2.1
Эта команда выставляет ваш IP4 DNS, который в этом случае 192.168.2.1
На этом шаге вы уже знаете DNS.
Шаг 3
Давайте продолжим busybox
контейнер для подключения с помощью этого DNS, запустив
>> docker run --dns 192.168.2.1 busybox nslookup google.com
Server: 192.168.2.1
Address 1: 192.168.2.1 giftcard.dyndns.org
Name: google.com
Address 1: 2404:6800:4003:c03::65
....
Шаг 4
Если ваш результат аналогичен шагу 3, значит, ваша проблема в том, что Docker не может подключиться, потому что Docker не знает, будет ли использоваться DNS, поэтому мы исправим это, сделав daemon.json
файл и найдите это в /etc/docker/daemon.json
, это содержание поставить.
{
"dns": ["192.168.2.1", "8.8.8.8"] // 192.168.2.1 is value of your dns
}
Шаг 5
Перезапустите ваш докер
>> sudo service docker restart
Я столкнулся с этой же проблемой. Мое обходное решение заключалось в том, чтобы прикрепитьdocker build
в известную работающую и доступную сеть Docker.
Обходной путь
docker network ls
- Выберите известную рабочую сеть
docker build --network=<known working network name>
По умолчанию Docker использует для построения сеть по умолчанию. Настройка сети вручную обеспечивает доступ к сети Интернет.
Я пробовал все выше, и у меня ничего не работало. Скрипт curiosity dockerd systemd не запускался при добавлении параметра --dns.
В моем случае проблема заключалась в том, что в ubuntu /etc/resolv.conf автоматически генерируется systemd-resolved и указывает на локальный ip 127.0.0.53, где работает DNS-кеш, безумно, но с этой информацией контейнеры, которые пытаются разрешить DNS с самим собой в его интерфейсе looppack. Изменение resolv.conf вручную на DNS нашей компании в локальной сети устранило проблему, а затем изменило systemd-resolved, чтобы сделать это навсегда.
Если вы можете выполнить ping/curl в реестре npm, но по-прежнему получаете ошибку с npm install
, ошибка может быть связана с отсутствием пакета ca-certs. Добавьте следующую строку в Dockerfile передnpm install
и перестроим образ.
FROM node:alpine
# Installing cert package will allow resolving the error to https://registry.npmjs.org/
RUN apk add --no-cache ca-certificates
RUN npm install
CMD ["npm", "start"]
Для меня проблема заключалась в том, что мой раздел подкачки имел проблемы после изменения размера корневого раздела и запрашивал у меня пароль для почти всех системных задач (таких как команды apt get, повторная загрузка / перезагрузка и т. Д.).
Пожалуйста, введите кодовую фразу для диска... (cryptswap1) ни на одном
Заметка
Попробуйте только это, если вы также видите ошибку выше и испытываете проблему, описанную в вопросе, когда вы пытаетесь выполнить npm install
внутри док-контейнера:
Ошибка: getaddrinfo ENOTFOUND/EAI_AGAIN registry.npmjs.org registry.npmjs.org:443
Решение
- Откройте GParted и проверьте, где смонтирован ваш раздел подкачки, например /dev/sda5 (обозначается как "SWAP_PARTITION")
редактировать
/etc/crypttab
и заменитьUUID=****
чтобы получить следующий шаблон:cryptswap1 /dev/SWAP_PARTITION/ /dev/urandom swap,**,cipher=****
Перезагрузитесь, если вам все еще задают пароль, продолжайте:
- Выполнить команду
sudo dd if=/dev/zero of=/dev/SWAP_PARTITION/ bs=512 count=20480
и перезагрузите компьютер. Это исправило это для меня.
Я следил за учебником. У меня этой ошибки не возникает, когда я копирую все свои файлы:
# Specify base image
FROM node:alpine
WORKDIR /usr/app
# Install dependencies
COPY ./ ./
RUN npm install
# Default command
CMD ["npm", "start"]
Это случается со мной, когда я копирую package.json
сначала, а затем скопируйте другие файлы после npm install
:
# Specify base image
FROM node:alpine
WORKDIR /usr/app
# Install dependencies
COPY ./package.json ./
RUN npm install
COPY ./ ./
# Default command
CMD ["npm", "start"]