Предупреждение о пряже при сборке докера

При запуске yarn install внутри моего док-контейнера выдается предупреждение об отсутствии соединения. https://hub.docker.com/r/tavern/rpg-web/~/dockerfile/

warning You don't appear to have an internet connection. Try the --offline flag to use the cache for registry queries.

Что может быть причиной этого?


person wesleycoder    schedule 21.10.2016    source источник
comment
Та же проблема для меня   -  person rgareth    schedule 28.10.2016
comment
Если пряжа не устанавливает пакеты, попробуйте выполнить сетевое действие как часть этой команды. Пример: «ЗАПУСК ping -c1 google.com && yarn install». Это делает работу   -  person Sunil Kumar    schedule 11.05.2017


Ответы (1)


Поскольку в вашем Dockerfile есть строка, читающая RUN yarn (т. е. без использования автономных параметров пряжи), пряжа пытается определить, будет ли Интернет доступен автоматически, без отправки каких-либо пакетов.

Как пряжа проверяет онлайн-статус?

Это делается путем перечисления доступных сетевых интерфейсов в контексте построителя докеров с использованием узла os.networkInterfaces(), который задокументирован здесь.

Это, в свою очередь, вызывает GetInterfaceAddresses, который поддерживается uv_interface_addresses libuv. Функция libuv возвращает только те интерфейсы, которым назначен IP-адрес и установлены флаги IFF_UP и IFF_RUNNING.

Чтобы увидеть, какие адреса на самом деле возвращаются в код Javascript, вы можете временно добавить эту строку в свой Dockerfile:

RUN node -e 'const os = require("os"); const interfaces = os.networkInterfaces(); for (const interface in interfaces) {console.log(interface); const addrs = interfaces[interface]; for (const addr of addrs) {console.log(addr.address)}}'

По крайней мере, в моем случае это вернуло только петлевой адрес, который пряжа явно игнорирует в 1:

lo 127.0.0.1 ::1

Но запуск ifconfig в образе докера также показал интерфейс eth0. HWaddr этого интерфейса соответствует интерфейсу docker0 на машине, на которой работает демон docker. Это говорит о том, что контекст построителя работает с сетью моста докеров.

Итак, по каким критериям исключается мостовая сеть из списка libuv?

В моем случае сеть докеров не устанавливала IFF_RUNNING. Это не так уж удивительно, поскольку в документации Linux говорится, что это поле предназначено для обратной связи. совместимость.

Чтобы убедиться, что это так в вашем случае, вы можете использовать слегка измененную версию примера программы в этот документ, добавьте этот код после первого вызова printf():

printf("RUNNING: %s", (ifa->ifa_flags & IFF_RUNNING) ? "TRUE" : "FALSE");

Почему докер не устанавливает IFF_RUNNING?

Установка флагов интерфейса — низкоуровневая операция, которую docker не обрабатывает сам. libnetwork Docker делегирует библиотеку netlink здесь, но только netlink устанавливает IFF_UP.

Как это можно исправить?

Соответствующие движущиеся части этой проблемы находятся в открытом доступе!

netlink был изменен, чтобы открыть IFF_RUNNING для чтения - может быть возможно включить libnetwork (и, следовательно, docker), чтобы установить этот флаг с помощью дальнейшего изменения netlink.

В качестве альтернативы libuv может быть расширен после проблемы Github по этому вопросу. Такой новый API в конечном итоге можно было бы использовать в node.js и yarn, которые будут отображать интерфейсы независимо от назначенных IP-адресов и состояния IFF_RUNNING.

person NotJavanese    schedule 21.11.2016
comment
Интересно. У вас есть возможное объяснение, почему это иногда происходит в одном и том же контейнере, а иногда все в порядке? - person Gavriel; 05.04.2017