Ответ 1
Так как ваш файл Dockerfile имеет строку, читающую RUN yarn
(т.е. не используя параметры нити в автономном режиме), пряжа пытается определить, может ли интернет быть доступен автоматически без отправки каких-либо пакетов.
Как пряжка проверяет статус онлайн?
Это делается путем перечисления доступных сетевых интерфейсов в контексте построителя docker с помощью node os.networkInterfaces()
, который документирован здесь.
Это, в свою очередь, вызывает GetInterfaceAddresses
, который поддерживается libuv uv_interface_addresses
. Функция libuv возвращает только интерфейсы, у которых есть назначенный IP-адрес, и установлены флаги IFF_UP
и IFF_RUNNING
.
Чтобы узнать, какие адреса действительно возвращаются в код Javascript, вы можете временно добавить эту строку в свой файл Docker:
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)}}'
По крайней мере, в моем случае это только возвращало адрес loopback, который пряжа явно игнорирует в 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 делегирует библиотеку netlink здесь, но только для netlink устанавливает IFF_UP
.
Как это можно исправить?
Соответствующие движущиеся части этой проблемы - с открытым исходным кодом!
netlink был изменен, чтобы вывести IFF_RUNNING
для чтения - возможно, включить libnetwork (и, таким образом, докер), установить этот флаг через дальнейшее изменение netlink.
Альтернативно libuv может быть расширен после проблема Github по теме. Такой новый API в конечном итоге может быть использован в node.js и нити, которая будет отображать интерфейсы независимо от назначенных IP-адресов и состояния IFF_RUNNING
.