Docker Error: Error: Os { code: 6, kind: Uncategorized, message: "No such device or address" }

近日在使用 Docker 包装程序时,遇到如下错误:

Error: Os { code: 6, kind: Uncategorized, message: "No such device or address" }

程序在开发环境中运行一切正常,排除了文件挂载问题,一直没有头绪。
排错过程中我忽略了一个问题,进行调试的时候使用的命令是 docker run -it 给容器分配了伪终端,其实问题就出现在这里。

程序运行时需要调用 tty 或访问标准输入输出(如 /dev/tty)设备。当没有分配伪终端时,这些设备根本不存在,因此就报出了 No such device or address 的错误。

解决方法

命令行

使用 docker run -t 创建容器

Docker compose

1
2
3
services:
app:
tty: true

Windows Docker Proxy

Dockerhub 在中国的访问速度不佳,我们通常需要使用代理来进行加速。
Windows Docker 是基于 WSL 运行的,并不是直接运行在我们的 Windows 系统之上。
通常我们设置代理会使用 127.0.0.1 作为代理的主机地址,但是在 WSL 中 127.0.0.1 已经成为了 WSL Linux 的回环地址,无法链接到运行在 Windows 上的代理服务。
安装 WSL 后,系统会生成一个虚拟的网卡:
打开 PowerShell (cmd), 输入 ipconfig

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
PS C:\Users\program-03> ipconfig

Windows IP 配置


以太网适配器 vEthernet (WSL):

连接特定的 DNS 后缀 . . . . . . . :
本地链接 IPv6 地址. . . . . . . . : fe80::a179:32ed:cebd:24df%28
IPv4 地址 . . . . . . . . . . . . : 172.22.144.1
子网掩码 . . . . . . . . . . . . : 255.255.240.0
默认网关. . . . . . . . . . . . . :

以太网适配器 以太网:

连接特定的 DNS 后缀 . . . . . . . :
本地链接 IPv6 地址. . . . . . . . : fe80::4ca0:44b2:46f4:25f6%5
IPv4 地址 . . . . . . . . . . . . : 192.168.6.103
子网掩码 . . . . . . . . . . . . : 255.255.255.0
默认网关. . . . . . . . . . . . . : 192.168.6.1

以太网适配器 VMware Network Adapter VMnet1:

连接特定的 DNS 后缀 . . . . . . . :
本地链接 IPv6 地址. . . . . . . . : fe80::ad37:b9f8:8199:dc60%8
IPv4 地址 . . . . . . . . . . . . : 192.168.111.1
子网掩码 . . . . . . . . . . . . : 255.255.255.0
默认网关. . . . . . . . . . . . . :

以太网适配器 VMware Network Adapter VMnet8:

连接特定的 DNS 后缀 . . . . . . . :
本地链接 IPv6 地址. . . . . . . . : fe80::e09c:ce9c:952b:4494%6
IPv4 地址 . . . . . . . . . . . . : 192.168.40.1
子网掩码 . . . . . . . . . . . . : 255.255.255.0
默认网关. . . . . . . . . . . . . :

vEthernet (WSL) 就是 WSL 的默认地址,开启代理的局域网访问功能。
设置 Docker Proxy 为 http://172.22.144.1:10811