我正在使用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的方法。
答案 0 :(得分:2)
/sbin/init
是一项名为systemd的服务。如果您查看链接的页面,它会执行很多操作–配置各种内核参数,挂载文件系统,配置网络,启动getty
进程,等等。其中许多事情需要更改主机全局设置,并且如果您使用--privileged
启动容器,则表示systemd可以这样做。
关于此命令,我会给出两个关键建议:
不要在Docker中运行systemd。如果您确实需要多进程初始化系统,则supervisord很受欢迎,但更喜欢单进程容器。如果您知道需要一些 init (8)(进程ID 1负责),那么tini是另一个流行的选择。
不要直接运行裸露的Linux发行版映像。无论您要运行的是哪种软件,几乎都可以肯定地不在alpine
或ubuntu
映像中。 Build a custom image拥有您需要的软件并运行 that ;您应该正确设置其CMD
,以便可以docker run
进行图像,而无需进行任何手动设置。
还请记住,完全可以运行任何Docker命令的功能意味着对主机的无限制根级访问。您会在这里看到--privileged
容器接管主机控制台的情况。读取和编辑主机/etc/shadow
和/etc/sudoers
之类的文件也非常容易。所显示的脚本在技术上没有任何问题,但是您需要非常小心标准的安全性。