更新:Docker 0.9.0现在使用libcontainer,转移到LXC,请参阅:Attaching process to Docker libcontainer container
我正在运行弹性搜索:
docker run -d -p 9200:9200 -p 9300:9300 dockerfile/elasticsearch
检查它显示的过程如下:
$ docker ps --no-trunc
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
49fdccefe4c8c72750d8155bbddad3acd8f573bf13926dcaab53c38672a62f22 dockerfile/elasticsearch:latest /usr/share/elasticsearch/bin/elasticsearch java About an hour ago Up 8 minutes 0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp pensive_morse
现在,当我尝试连接正在运行的容器时,我会堆积起来:
$ sudo docker attach 49fdccefe4c8c72750d8155bbddad3acd8f573bf13926dcaab53c38672a62f22
[sudo] password for lsoave:
$ sudo lxc-attach -n 49fdccefe4c8c72750d8155bbddad3acd8f573bf13926dcaab53c38672a62f22
root@49fdccefe4c8:/# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 49 20:37 ? 00:00:20 /usr/bin/java -Xms256m -Xmx1g -Xss256k -Djava.awt.headless=true -XX:+UseParNewGC -XX:+UseConcMa
root 88 0 0 20:38 ? 00:00:00 /bin/bash
root 92 88 0 20:38 ? 00:00:00 ps -ef
root@49fdccefe4c8:/#
有人知道docker attach有什么问题吗?
NB。 dockerfile/elasticsearch以:
结束ENTRYPOINT ["/usr/share/elasticsearch/bin/elasticsearch"]
答案 0 :(得分:7)
您附加到运行elasticsearch
的容器,该容器不是交互式命令。你没有得到一个shell来输入,因为容器没有运行shell。 lxc-attach
工作的原因是因为它为您提供了一个默认shell。每man lxc-attach:
如果未指定命令,则为用户的当前默认shell 运行lxc-attach将在容器内查找 执行。如果容器内不存在此类用户,则会失败 或者容器没有可用的nsswitch机制。
docker attach
的行为符合预期。
答案 1 :(得分:4)
正如Ben Whaley所说,这是预期的行为。 值得一提的是,如果你想监控这个过程,你可以做很多事情:
$ES_DIR/bin/elasticsearch && /bin/bash
会给你你的外壳。在开发过程中主要有用。不太干净:)。docker cp
在本地获取日志,或者更好地使用docker logs $CONTAINER_ID
命令。后者每次都会为容器的entre生命周期提供累积的stdin / stderr输出。答案 2 :(得分:4)
FWIW,现在已经发布了Docker 1.3,您可以使用“docker exec”在正在运行的容器上打开shell或其他进程。这应该允许您在使用本机驱动程序时有效地替换lxc-attach。