是否可以在正在运行的容器中启动shell会话(没有ssh)

Max*_* L. 335 docker

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

docker run "id of running container" /bin/bash
Run Code Online (Sandbox Code Playgroud)

它看起来不可能,我得到错误:

2013/07/27 20:00:24 Internal server error: 404 trying to fetch remote history for 27d757283842
Run Code Online (Sandbox Code Playgroud)

所以,如果我想在一个正在运行的容器中运行bash shell(例如用于诊断目的)

我必须在其中运行SSH服务器并通过ssh登录吗?

Mic*_*arf 610

使用docker 1.3,有一个新命令docker exec.这允许您输入正在运行的泊坞窗:

docker exec -it "id of running container" bash
Run Code Online (Sandbox Code Playgroud)

  • 很有帮助.这应该标记为解决方案. (3认同)
  • 这对我很有用.对于docker run非常有用. (2认同)

cre*_*ack 278

编辑:现在你可以使用docker exec -it "id of running container" bash(doc)

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

如果您真的必须并且处于调试环境中,则可以执行此操作:sudo lxc-attach -n <ID> 请注意,id必须是完整的(docker ps -notrunc).

但是,我强烈建议不要这样做.

notice:-notrunc已弃用,--no-trunc很快就会被替换.

  • 我建议反对它,因为1)它需要一个非常新的内核,2)你在docker之外做事情所以你将无法跟踪它(日志,附加等).此外,docker现在可能会使用lxc,但不保证它会永远这样做. (7认同)
  • 截至0.9泊坞窗默认情况下不再使用LXC运行.你必须使用`docker -d -e lxc`启动docker deamon (2认同)
  • Max L.,您的用例可以通过[数据量](http://docs.docker.com/userguide/dockervolumes/)解决.未经测试的示例:1)在数据卷中运行带有nginx日志的容器:`docker run -v/var/log/nginx -name somename imagename command`; 2)运行另一个容器来查看数据卷内容:`docker run -volumes-from somename -i -t busybox/bin/sh`. (2认同)

max*_*lec 14

做就是了

docker attach container_name
Run Code Online (Sandbox Code Playgroud)

正如在评论中提到,从容器分离不停止,键入Ctrlp然后Ctrlq.

  • 谢谢!!它有所帮助.在实际问题的背景下,我想补充一些内容.使用`docker attach container_name`调试我们的容器后,使用`ctrl p`和`ctrl q`而不是`exit`.`exit`命令停止容器,其中`ctrlp`和`ctrl q`只是分离该容器并使其保持运行 (5认同)

Teu*_*ndo 10

由于事情正在变化,目前推荐的访问正在运行的容器的方法正在使用nsenter.

您可以在此github存储库中找到更多信息.但一般来说你可以像这样使用nsenter:

PID=$(docker inspect --format {{.State.Pid}} <container_name_or_ID>)
nsenter --target $PID --mount --uts --ipc --net --pid
Run Code Online (Sandbox Code Playgroud)

或者您可以使用包装器docker-enter:

docker-enter <container_name_or_ID>
Run Code Online (Sandbox Code Playgroud)

关于这个主题的一个很好的解释可以在JérômePetazzoni的博客文章中找到: 为什么你不需要在你的docker容器中运行sshd


Ale*_*dro 8

首先,你无法运行

docker run "existing container" command
Run Code Online (Sandbox Code Playgroud)

因为这个命令期望一个图像而不是一个容器,它无论如何都会导致产生一个新的容器(所以不是你想看的那个)

我同意这样的事实:对于docker,我们应该以不同的方式进行思考(所以你应该找到方法,这样你就不需要登录容器了),但我仍觉得它很有用,这就是我的工作方式周围.

我在DEAMON模式下通过主管运行我的命令.

然后我执行我所说docker_loop.sh 的内容就是这样:

#!/bin/bash
/usr/bin/supervisord
/usr/bin/supervisorctl
while ( true )
    do
    echo "Detach with Ctrl-p Ctrl-q. Dropping to shell"
    sleep 1
    /bin/bash
done
Run Code Online (Sandbox Code Playgroud)

它的作用是允许您"附加"到容器并显示supervisorctl用于停止/启动/重新启动和检查日志的界面.如果这还不够,你可以Ctrl+D,你会掉进一个外壳,让你可以看到它就像是一个普通的系统.

请注意,该系统不如没有外壳的容器那么安全,因此请采取所有必要步骤来保护容器.


foz*_*foz 5

留意这个拉取请求:https : //github.com/docker/docker/pull/7409

它实现了即将到来的docker exec <container_id> <command>实用程序。如果可用,应该可以例如在正在运行的容器内启动和停止ssh服务。

nsinit可以执行以下操作:“ nsinit提供了一种方便的方法来访问正在运行的容器的命名空间中的shell”,但是看起来很难运行。 https://gist.github.com/ubergarm/ed42ebbea293350c30a6