附加进程到Docker lib容器容器

在v0.9.0之前的Docker发行版中,可以使用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完成。

检查你是否有nsenter工具。 它应该在2.23版本之后的util-linux软件包中。 注意:不幸的是,Debian和Ubuntu仍然使用util-linux 2.20。

如果你有nsenter ,这是相对容易的。 首先,find容器的第一个进程的PID(实际上,任何PID都可以,但是这样更简单,更安全):

 PID=$(docker inspect --format '{{.State.Pid}}' my_container_id) 

然后,像这样input:

 nsenter --target $PID --mount --uts --ipc --net --pid 

瞧! 但是,请注意, nsenter不会兑现能力。

如果你没有nsenter (例如,如果你使用的是Debian或者Ubuntu,或者你的发行版有太旧的util-linux),你可以下载util-linux并编译它。 我有一个nsenter二进制文件,也许我可以上传到Dockerregistry,如果这可以帮助任何人。

另一种select是使用nsinit ,一个nsinit的辅助工具。 我不认为有很多关于nsinit的文档,因为它是非常新的,但是以https://asciinema.org/a/8090为例。 您将需要一个Go编译环境。