在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完成此操作。
答案 0 :(得分:9)
检查您是否拥有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构建环境。