将进程附加到Docker的libcontainer容器

9
在 Docker v0.9.0 之前的版本中,您可以使用 lxc-attach 命令将进程注入到容器中。例如:
docker run -d ubuntu:12.04
docker inspect {{containerhash}} | grep ID
// "ID": "d846ae242838de66f12414fbc8807acb3c77778bdb81babab7115261f4242284"
sudo lxc-attach -n d846ae242838de66f12414fbc8807acb3c77778bdb81babab7115261f4242284 -- /bin/bash

由于0.9.0切换到libcontainer,此方法已不再适用。

如何通过libcontainer来实现呢?

可以通过启动选项切换到lxc,但我想知道如何通过libcontainer来完成此操作。


看看我在这个主题上的所有答案。我总是建议不要使用lxc-attach,因为它可能会有问题 :)。然而,仍然可以使用nsinit。 - creack
1个回答

9
检查您是否拥有 nsenter 工具。 它应该在 util-linux 包中,版本为 2.23 及以上。注意:不幸的是,Debian 和 Ubuntu 仍然使用 util-linux 2.20。
如果您拥有 nsenter 工具,那么就相对容易了。首先,找到容器的第一个进程的 PID(其实任何 PID 都可以,但这样更容易和更安全):
PID=$(docker inspect --format '{{.State.Pid}}' my_container_id)

然后,像这样输入:
nsenter --target $PID --mount --uts --ipc --net --pid

注意,nsenter 不支持特权。

如果你没有 nsenter(例如,如果你使用的是 Debian 或 Ubuntu,或者你的发行版版本过旧),你可以下载 util-linux 并编译它。我有一个 nsenter 二进制文件,如果能帮到别人的话,我可以上传到 Docker 注册表。

另一个选择是使用 nsinit,这是 libcontainer 的一个辅助工具。我认为关于 nsinit 的文档并不多,因为它非常新,但可以参考 https://asciinema.org/a/8090 的示例。你需要一个 Go 编译环境。


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