我正在使用python docker软件包使用Ubuntu:16.04镜像创建一个docker容器。我将tty作为True传递,并作为True分离给client.containers.run()函数。容器以/ sbin / init进程开始。容器创建成功。但是问题是,主机上的登录提示被主机控制台上的容器登录提示替换。结果,我无法在控制台上的计算机上登录。与计算机的SSH连接正常。
即使将SSH连接到计算机后运行python脚本,也会发生这种情况。我尝试了其他选项,例如将tty设置为False,将stdout设置为False,在容器中将环境变量TERM设置为xterm,但没有任何帮助。
如果有人可以为这个问题提出解决方案,那将是非常不错的。
我的脚本很简单:
import docker
client = docker.from_env()
container = client.containers.run('ubuntu:16.04', '/sbin/init', privileged=True,
detach=True, tty=True, stdin_open=True, stdout=False, stderr=False,
environment=['TERM=xterm'])
我没有使用任何dockerfile。
我能够弄清楚在特权模式下启动容器时会发生此问题。如果执行此操作,则/ sbin / init进程将启动/ sbin / agetty进程,这会导致/ dev / tty附加到容器。我需要找出一种不创建/ sbin / agetty进程的方式来启动/ sbin / init。
最佳答案
Ubuntu中的/sbin/init
是一项名为systemd的服务。如果您查看链接页面,它会执行大量操作–配置各种内核参数,挂载文件系统,配置网络,启动getty
进程等。其中许多操作都需要更改主机全局设置,并且如果您启动了带有--privileged
的容器,您允许systemd执行此操作。
关于此命令,我将给出两个关键建议:
不要在Docker中运行systemd。 如果您确实需要多进程init系统,supervisord很流行,但是更喜欢单进程容器。如果您知道需要一些 init (8)(进程ID 1有一些责任),那么tini是另一个受欢迎的选择。
不要直接运行裸Linux分发镜像。 无论您尝试运行什么软件,几乎都可以肯定它不在alpine
或ubuntu
图像中。 Build a custom image具有您需要的软件并运行该软件;您应正确设置其CMD
,以便无需任何手动设置即可对图像进行docker run
。
还要记住,完全可以运行任何Docker命令的能力意味着对主机的不受限制的根级别访问。您在这里看到了一些内容,其中--privileged
容器接管了主机的控制台。读取和编辑主机/etc/shadow
和/etc/sudoers
之类的文件也非常容易。所显示的脚本在技术上没有任何问题,但是您需要特别注意标准的安全性。
关于docker - 从主机控制台分离容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55655763/