在我的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.
导致这种情况的原因是什么?
答案 0 :(得分:15)
由于您的Dockerfile有一行读数RUN yarn
(即不使用纱线的离线选项),纱线会尝试确定互联网是否可能自动可用而不发送任何数据包。
这是通过使用节点os.networkInterfaces()
枚举docker builder上下文中的可用网络接口来完成的,该节点记录为here。
这反过来调用由libuv的GetInterfaceAddresses
支持的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)}}'
至少在我的情况下,这只返回了环回地址,在1中明确忽略了该地址:
lo
127.0.0.1
::1
但是在docker镜像中运行ifconfig
也显示了eth0
界面。此接口的HWaddr
与运行docker守护程序的计算机上的docker0
接口的IFF_RUNNING
匹配。这表明构建器上下文与docker bridge网络一起运行。
就我而言,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}}状态如何,都会列出接口。