docker - 从主机控制台分离容器

标签 docker

我正在使用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分发镜像。 无论您尝试运行什么软件,几乎都可以肯定它不在alpineubuntu图像中。 Build a custom image具有您需要的软件并运行该软件;您应正确设置其CMD,以便无需任何手动设置即可对图像进行docker run

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

关于docker - 从主机控制台分离容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55655763/

相关文章:

docker - 如何在 systemd 中运行在容器中运行的服务,包括 systemd-notify 和日志记录

node.js - 标准_init_linux.go :190: exec user process caused "exec format error" The command '/bin/sh -c npm install' returned a non-zero code: 1

Docker 使用 gosu vs USER

node.js - 请在 docker npm test 中设置 "CHROME_BIN"env 变量

vagrant - 如何从 Vagrant 配置 Dockerfile

macos - 在 MacOS 上使用 --network=host 运行 docker 容器时如何访问主机上的端口?

docker - 同一网络上的Docker容器通信不起作用

Docker RUN 持久化环境变量?

docker - 无法从 Web 界面访问 ArangoDB 服务

amazon-web-services - ECS 代理无法成功从 ECR 拉取镜像