码头构建的纱线警告

时间:2016-10-21 22:07:14

标签: docker yarnpkg

在我的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.

导致这种情况的原因是什么?

1 个答案:

答案 0 :(得分:15)

由于您的Dockerfile有一行读数RUN yarn(即不使用纱线的离线选项),纱线会尝试确定互联网是否可能自动可用而不发送任何数据包。

纱线如何检查在线状态?

这是通过使用节点os.networkInterfaces()枚举docker builder上下文中的可用网络接口来完成的,该节点记录为here

这反过来调用由libuv的GetInterfaceAddresses支持的uv_interface_addresses。 libuv函数仅返回分配了IP地址且设置了IFF_UPIFF_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

但是在docker镜像中运行ifconfig也显示了eth0界面。此接口的HWaddr与运行docker守护程序的计算机上的docker0接口的IFF_RUNNING匹配。这表明构建器上下文与docker bridge网络一起运行。

那么从libuv的列表中排除桥接网络的标准是什么?

就我而言,docker网络没有设置printf()。这并不太令人惊讶,因为Linux documentation表示此字段是为了向后兼容。

要在您的实例中验证是这种情况,您可以在this document中使用稍微修改过的示例程序版本,在第一次printf("RUNNING: %s", (ifa->ifa_flags & IFF_RUNNING) ? "TRUE" : "FALSE"); 调用后添加此代码:

IFF_RUNNING

为什么码头工具设置IFF_RUNNING

设置接口标志是docker不处理自身的低级操作。 Docker的libnetwork委托给netlink库here,但仅限netlink sets IFF_UP

如何解决?

此问题的相关活动部分是开源的!

netlink是changed来公开IFF_RUNNING进行阅读 - 有可能通过进一步更改为netlink来启用libnetwork(以及docker)来设置该标志。

或者,可以在Github issue on the subject之后扩展libuv。这样的新API最终可以在node.js和yarn中使用,无论分配的IP地址和{{1}}状态如何,都会列出接口。