在v0.9.0之前的Docker版本中,您可以使用lxc-attach将进程附加(注入(inject))到容器中。例如:

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来实现。

最佳答案

检查您是否拥有nsenter工具。在版本2.23之后,它应该位于util-linux包中。注意:不幸的是,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太旧),则可以下载util-linux并进行编译。我有一个nsenter二进制文件,如果可以帮助任何人,也许我可以将其上传到Docker注册表。

另一个选择是使用nsinit,它是libcontainer的帮助工具。我不认为nsinit有很多文档,因为它很新,但是请查看https://asciinema.org/a/8090作为示例。您将需要一个Go构建环境。

关于docker - 将过程附加到Docker libcontainer容器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22338509/

10-11 15:26