从主机控制台分离容器

时间:2019-04-12 16:13:52

标签: docker

我正在使用python docker软件包使用Ubuntu:16.04映像创建docker容器。我将tty作为True传递并且将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的方法。

1 个答案:

答案 0 :(得分:2)

Ubuntu中的

/sbin/init是一项名为systemd的服务。如果您查看链接的页面,它会执行很多操作–配置各种内核参数,挂载文件系统,配置网络,启动getty进程,等等。其中许多事情需要更改主机全局设置,并且如果您使用--privileged启动容器,则表示systemd可以这样做。

关于此命令,我会给出两个关键建议:

不要在Docker中运行systemd。如果您确实需要多进程初始化系统,则supervisord很受欢迎,但更喜欢单进程容器。如果您知道需要一些 init (8)(进程ID 1负责),那么tini是另一个流行的选择。

不要直接运行裸露的Linux发行版映像。无论您要运行的是哪种软件,几乎都可以肯定地不在alpineubuntu映像中。 Build a custom image拥有您需要的软件并运行 that ;您应该正确设置其CMD,以便可以docker run进行图像,而无需进行任何手动设置。

还请记住,完全可以运行任何Docker命令的功能意味着对主机的无限制根级访问。您会在这里看到--privileged容器接管主机控制台的情况。读取和编辑主机/etc/shadow/etc/sudoers之类的文件也非常容易。所显示的脚本在技术上没有任何问题,但是您需要非常小心标准的安全性。