Подтвердить что ты не робот

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

При запуске 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.

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

4b9b3361

Ответ 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.