docker上的纱线警告
在我的docker集装箱内运行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.
什么可能导致这个?
由于您的Dockerfile有一行读取RUN yarn
(即不使用纱线离线选项),因此纱线将尝试确定互联网是否可能在不发送任何数据包的情况下自动使用。
纱线如何检查在线状态?
这是通过使用节点的os.networkInterfaces()
来在泊坞窗生成器上下文中枚举可用的networking接口来完成的, 此处将对此进行介绍。
这又会调用由libuv的uv_interface_addresses
支持的uv_interface_addresses
。 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)}}'
至less在我的情况下,这只返回了回送地址,哪一根纱线在1 :
lo 127.0.0.1 ::1
但在Docker镜像中运行ifconfig
显示了一个eth0
接口。 该接口的HWaddr
与运行docker0
守护进程的机器上的docker0
接口匹配。 这表明build造者上下文与docker桥networking一起运行。
那么从libuv列表中排除桥接networking的标准是什么?
在我的情况下,dockernetworking没有设置IFF_RUNNING
。 这并不奇怪,因为Linux文档说这个领域是为了向后兼容。
为了validation这种情况,您可以在本文中使用稍微修改过的示例程序版本,在第一次printf()
调用之后添加以下代码:
printf("RUNNING: %s", (ifa->ifa_flags & IFF_RUNNING) ? "TRUE" : "FALSE");
为什么不是docker设置IFF_RUNNING
?
设置接口标志是一个低级的操作,docker不处理自己。 Docker的libnetwork 在这里委托给netlink库,但是netlink只设置IFF_UP
。
如何解决?
这个问题的相关移动部分是开源的!
netlink被更改为暴露IFF_RUNNING
读取 – 可能有可能启用libnetwork(并因此docker)通过进一步更改netlink设置该标志。
或者libuv可能会延期关于这个问题的Github问题 。 这样一个新的API最终可以用在node.js和yarn中,而不pipe分配的IP地址和IFF_RUNNING
状态如何。