问题:在Docker中运行Ubuntu Bash Shell时出现错误。

5
我正在我的基于ARM的32位设备上运行Docker。
但是,当我尝试通过命令“docker run -it ubuntu bash”运行Ubuntu Bash shell作为Docker容器时,我一直收到以下错误:
docker: Error response from daemon: OCI runtime create failed: 
container_linux.go:348: starting container process caused 
"process_linux.go:402: container init caused \"open /dev/ptmx: no such file or directory\"": unknown.

以下是docker info的输出结果:

Containers: 4
Running: 0
Paused: 0
Stopped: 4
Images: 3
Server Version: 18.06.1-ce
Storage Driver: vfs
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
 Volume: local
 Network: bridge host macvlan null overlay
 Log: awslogs fluentd gcplogs gelf journald json-file logentries splunk syslog
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: 468a545b9edcd5932818eb9de8e72413e616e86e
runc version: 69663f0bd4b60df09991c08812a60108003fa340
init version: fec3683
Security Options:
 seccomp
  Profile: default
Kernel Version: 3.10.65-00273-gfa38327-dirty
OSType: linux
Architecture: armv7l
CPUs: 4
Total Memory: 923MiB
ID: 2PDV:3KHU:VZZM:DM6F:4MVR:TXBN:35YJ:VWP5:TMHD:GMKW:TPMI:MALC
Docker Root Dir: /opt/usr/media/docker_workdir
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
 127.0.0.0/8
Live Restore Enabled: false

如果有人能告诉我错在哪里以及如何解决,那就太好了。

3个回答

1

可能由于某种原因,您的Docker容器无法找到自己的/dev/ptmx甚至可能是您的/dev/全部丢失。

一个快速解决方案是执行以下操作:

docker run -it -v /dev:/dev ubuntu bash

这将绑定您的/dev/目录到容器中,这意味着它们将使用相同的文件。 请注意,尽管这个操作本身是无害的,但在生产环境中,这意味着主机和容器设备之间的隔离已经消失。 因此,请确保只在测试环境中使用此技巧。

1
当我在Jenkins作业中运行容器时,遇到了相同的问题,但是在我挂载/dev卷后,它就可以工作了。谢谢! - Foxy Fox

0

看起来你的操作系统缺少伪终端(PTY)-一种具有物理终端功能但实际上并不是物理终端的设备。

文件/dev/ptmx是一个字符文件,主要编号为5,次要编号为2,通常的模式为0666,所有者和组为root.root。它用于创建伪终端主从对。

文件

  • /dev/ptmx - UNIX 98主克隆设备
  • /dev/pts/* - UNIX 98从设备
  • /dev/pty[p-za-e][0-9a-f] - BSD主设备
  • /dev/tty[p-za-e][0-9a-f] - BSD从设备

参考:http://man7.org/linux/man-pages/man7/pty.7.html

这默认包含在Linux内核中。也许缺少它与您的操作系统架构有关。此外,我不确定如何解决问题,也许尝试更新和升级操作系统。

如果您不需要tty的快速解决方法是跳过-t标志:

docker run -i ubuntu bash

docker run -it中,-i/--interactive表示“保持stdin打开”,-t/--tty表示“告诉容器stdin是伪终端”。关键在于“交互”这个词。如果省略该标志,则容器仍会执行/bin/bash,但立即退出。使用该标志,容器将执行/bin/bash,然后耐心地等待您的输入。这意味着现在您将在容器内拥有bash会话,因此您可以在容器内执行lsmkdir或执行任何bash命令。


@GauravMishra 不客气 :). 如果我的回答解决了您的问题,那么我可以得到采纳的答案吗? - Raoslaw Szamszur
@RaoslawSzamsur 完成了 :) - Gaurav Mishra
它在没有使用“-t”情况下工作,但我仍然想知道发生了什么,因为我可以在/dev/中找到/ptmx文件。 - forgaoqiang

0
一个可行的解决方法: docker exec -i hello-world rm /dev/ptmx docker exec -i hello-world mknod /dev/ptmx c 5 2
或者启用内核配置:CONFIG_DEVPTS_MULTIPLE_INSTANCES=y

你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心中找到有关如何编写良好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接