我天真地期望这个命令在一个正在运行的容器中运行bash shell:

docker run "id of running container" /bin/bash

看起来是不可能的,我得到了一个错误:

2013/07/27 20:00:24 Internal server error: 404 trying to fetch remote history for 27d757283842

因此,如果我想在运行容器中运行bash shell(例如用于诊断目的)

我必须在里面运行SSH服务器并通过SSH登录吗?


当前回答

这是我的解决方案

在Dockerfile中:

# ...
RUN mkdir -p /opt
ADD initd.sh /opt/
RUN chmod +x /opt/initd.sh
ENTRYPOINT ["/opt/initd.sh"]

在initd.sh文件中

#!/bin/bash
...
/etc/init.d/gearman-job-server start
/etc/init.d/supervisor start
#very important!!!
/bin/bash

镜像构建后,你有两个选择使用exec或attach:

使用exec(首选)并运行: ——name $CONTAINER_NAME -dt $IMAGE_NAME 然后 - $CONTAINER_NAME /bin/bash 并使用CTRL + D分离 使用attach并运行: ——name $CONTAINER_NAME -dit $IMAGE_NAME 然后 附加$CONTAINER_NAME 并使用CTRL + P和CTRL + Q分离 注意:选项之间的区别是参数-i

其他回答

如果目标是检查应用程序的日志,这篇文章展示了启动tomcat并作为CMD的一部分跟踪日志。tomcat日志可以通过'docker logs containerid'在主机上获取。

http://blog.trifork.com/2013/08/15/using-docker-to-efficiently-create-multiple-tomcat-instances/

编辑:现在你可以使用docker exec -它“运行容器的id”bash (doc)

之前,这个问题的答案是:

如果您确实必须这样做,并且处于调试环境中,您可以这样做:sudo lxc-attach -n <ID> 注意,id必须是完整的(docker ps -notrunc)。

然而,我强烈建议不要这样做。

注意:-notrunc已弃用,它将很快被——no-trunc取代。

请关注这个拉请求:https://github.com/docker/docker/pull/7409

它实现了即将到来的docker exec <container_id> <命令>实用程序。当它可用时,应该可以在运行的容器中启动和停止ssh服务。

还有nsinit可以做到这一点:“nsinit提供了一种方便的方式来访问正在运行的容器名称空间中的shell”,但它看起来很难运行。 https://gist.github.com/ubergarm/ed42ebbea293350c30a6

在docker 1.3中,有一个新的命令docker exec。这允许你输入一个正在运行的docker:

docker exec -it "id of running container" bash

也许在开发容器时,您也像我一样被误导,从vm的角度进行思考。我的建议是:尽量不要。

容器就像任何其他过程一样。实际上,出于调试目的,您可能想要“附加”到它们(考虑/proc//env或strace -p),但这是非常特殊的情况。

通常你只是“运行”进程,所以如果你想修改配置或读取日志,只需创建一个新容器,并确保通过共享目录、写入stdout(这样docker日志就可以工作了)或类似的东西在容器外面写入日志。

出于调试目的,您可能希望先启动一个shell,然后启动代码,然后按CTRL-p + CTRL-q以保持shell不变。这样你就可以使用:

docker attach <container_id>

如果您希望调试容器,因为它正在做一些您不希望它做的事情,请尝试调试它:https://serverfault.com/questions/596994/how-can-i-debug-a-docker-container-initialization