Поскольку в вашем 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